1. 程式人生 > >Qt網路通訊實戰(TCP)

Qt網路通訊實戰(TCP)

伺服器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();
}