Qt網路通訊實戰(TCP)
阿新 • • 發佈:2018-12-10
伺服器UI截圖:
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QTcpServer> #include <QTcpSocket> #include <QDebug> #include <QList> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); protected: void changeEvent(QEvent *e); private: Ui::Dialog *ui; QTcpServer *sev; QTcpSocket *confd; QList<QTcpSocket *> clientList; private slots: void on_stopBtu_clicked(); void on_listenBtu_clicked(); void handNewConnection(); void handRead(); }; #endif // DIALOG_H
#include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void Dialog::on_listenBtu_clicked() { sev=new QTcpServer(); if(!sev->listen(QHostAddress::Any,6666)) { qDebug()<<sev->errorString(); return; } connect(sev,SIGNAL(newConnection()),this,SLOT(handNewConnection())); ui->listenBtu->setEnabled(false); ui->stopBtu->setEnabled(true); } void Dialog::handNewConnection() { confd=sev->nextPendingConnection(); clientList.append(confd); connect(confd,SIGNAL(readyRead()),this,SLOT(handRead())); } void Dialog::handRead() { /* 缺點每次只能與一個客戶端相連 QByteArray data=confd->readAll(); QString txt(data); ui->textEdit->append(txt); */ /* 多客戶端連伺服器 將連線控制代碼儲存到連結串列中 for(int i=0;i<clientList.size();i++) { confd=clientList.at(i); QByteArray data=confd->readAll(); if(data.size()==0) { continue; }else { QString txt(data); ui->textEdit->append(txt); return; } } */ confd =((QTcpSocket *)this->sender()); QByteArray data=confd->readAll(); QString txt(data); ui->textEdit->append(txt); } void Dialog::on_stopBtu_clicked() { sev->disconnect(); confd->disconnect(); ui->stopBtu->setEnabled(false); ui->listenBtu->setEnabled(true); }
#include <QtGui/QApplication> #include "dialog.h" #include <QTextCodec> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); Dialog w; w.show(); return a.exec(); }
客戶端UI截圖實戰:
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QTcpSocket>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
protected:
void changeEvent(QEvent *e);
private:
Ui::Dialog *ui;
QTcpSocket *sockfd;
private slots:
void on_sendBtu_clicked();
void on_connectBtu_clicked();
void handConnect();
void handRead();
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void Dialog::on_connectBtu_clicked()
{
sockfd=new QTcpSocket();
sockfd->connectToHost("192.168.1.110",6666);
connect(sockfd,SIGNAL(connected()),this,SLOT(handConnect()));
}
void Dialog::handConnect()
{
ui->sendBtu->setEnabled(true);
connect(sockfd,SIGNAL(readyRead()),this,SLOT(handRead()));
}
void Dialog::handRead()
{
QByteArray data=sockfd->readAll();
QString txt(data);
ui->textEdit->append("recv:"+txt);
}
void Dialog::on_sendBtu_clicked()
{
QByteArray data=ui->lineEdit->text().toUtf8();
sockfd->write(data);
ui->lineEdit->clear();
}
#include <QtGui/QApplication>
#include "dialog.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
Dialog w;
w.show();
return a.exec();
}