注意:服务器端在监听时,如果要接收其他主机的连接请求,需设置为

[cpp] view plain copy
  1. QHostAddress::Any  

一、客户端实现

1.tcpclient.h

[cpp] view plain copy
  1. #ifndef TCPCLIENT_H  
  2. #define TCPCLIENT_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QtNetwork>  
  6. #include <QtNetwork/QTcpSocket>  
  7.   
  8. namespace Ui {  
  9. class TcpClient;  
  10. }  
  11.   
  12. class TcpClient : public QMainWindow  
  13. {  
  14.     Q_OBJECT  
  15.   
  16. public:  
  17.     explicit TcpClient(QWidget *parent = 0);  
  18.     ~TcpClient();  
  19.   
  20. protected:  
  21.     void init();  
  22.     void newTcpConnect();     //用于建立服务器端与客户端的连接函数  
  23.   
  24. private:  
  25.     Ui::TcpClient *ui;  
  26.     QTcpSocket *tcpSocket;  
  27.   
  28. private slots:  
  29.     void receiveData();       //接收来自服务端的数据  
  30.     void displayError(QAbstractSocket::SocketError);  
  31. };  
  32.   
  33. #endif // TCPCLIENT_H  



2.tcpclient.cpp

[cpp] view plain copy
  1. #include "tcpclient.h"  
  2. #include "ui_tcpclient.h"  
  3.   
  4. #define ip "192.168.1.141"  
  5. #define port 8000  
  6.   
  7. TcpClient::TcpClient(QWidget *parent) :  
  8.     QMainWindow(parent),  
  9.     ui(new Ui::TcpClient)  
  10. {  
  11.     ui->setupUi(this);  
  12.     init();  
  13. }  
  14.   
  15. TcpClient::~TcpClient()  
  16. {  
  17.     delete ui;  
  18. }  
  19.   
  20.   
  21. void TcpClient::init()  
  22. {  
  23.     tcpSocket=new QTcpSocket(this);  
  24.     newTcpConnect();  
  25.     connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveData()));  
  26.     connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),  
  27.   
  28.                this,SLOT(displayError(QAbstractSocket::SocketError)));  
  29. }  
  30.   
  31.   
  32. void TcpClient::receiveData()  
  33. {  
  34.     QString datas=tcpSocket->readAll();  //接收字符串数据  
  35.     ui->receiveLineEdit->setText(datas);  //显示字符串数据  
  36. }  
  37.   
  38.   
  39. void TcpClient::newTcpConnect()  
  40. {  
  41.     tcpSocket->abort();  
  42.     tcpSocket->connectToHost(ip,port);  
  43. }  
  44.   
  45.   
  46.   
  47. void TcpClient::displayError(QAbstractSocket::SocketError)  
  48. {  
  49.    qDebug()<<tcpSocket->errorString();  
  50.    tcpSocket->close();  
  51. }  



二、服务端实现

1.tcpserver.h

[cpp] view plain copy
  1. #ifndef TCPSERVER_H  
  2. #define TCPSERVER_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QtNetwork>  
  6. #include <QtNetwork/QTcpSocket>  
  7. #include <QtNetwork/QTcpServer>  
  8. #include <QTimer>>  
  9.   
  10. namespace Ui {  
  11. class TcpServer;  
  12. }  
  13.   
  14. class TcpServer : public QMainWindow  
  15. {  
  16.     Q_OBJECT  
  17.   
  18. public:  
  19.     explicit TcpServer(QWidget *parent = 0);  
  20.     ~TcpServer();  
  21.   
  22. protected:  
  23.     void init();      //初始化函数用于完成一些诸如信号与槽之间的联系和变量初始化工作  
  24.   
  25.   
  26. private slots:  
  27.   
  28.     void on_sendButton_clicked();  
  29.   
  30.     void newListen();         //建立TCP监听事件  
  31.   
  32.     void acceptConnection();        //接收客户端连接  
  33.   
  34.     void displayError(QAbstractSocket::SocketError);    //显示错误信息  
  35.   
  36. private:  
  37.     Ui::TcpServer *ui;  
  38.     QTcpSocket *tcpSocket;  
  39.     QTcpServer *tcpServer;  
  40.     QTimer *timer;  
  41. };  
  42.   
  43. #endif // TCPSERVER_H  

2.tcpserver.cpp

[cpp] view plain copy
  1. #include "tcpserver.h"  
  2. #include "ui_tcpserver.h"  
  3.   
  4. TcpServer::TcpServer(QWidget *parent) :  
  5.     QMainWindow(parent),  
  6.     ui(new Ui::TcpServer)  
  7. {  
  8.     ui->setupUi(this);  
  9.     init();  
  10. }  
  11.   
  12. TcpServer::~TcpServer()  
  13. {  
  14.     delete ui;  
  15. }  
  16.   
  17. void TcpServer::init()  
  18. {  
  19.     timer=new QTimer;  
  20.     this->tcpServer=new QTcpServer(this);  
  21.     this->tcpSocket=new QTcpSocket(this);  
  22.   
  23.     newListen();  
  24.   
  25.     //当有客户端连接请求时发出信号,acceptConnection为信号处理函数  
  26.     connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));  
  27.     //当tcpSocket在接受客户端连接时出现错误,发出信号并处里  
  28.     connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),  
  29.             this,SLOT(displayError(QAbstractSocket::SocketError)));  
  30.   
  31. }  
  32.   
  33. void TcpServer::on_sendButton_clicked()  
  34. {  
  35.     this->tcpSocket->write(ui->sendLineEdit->text().toLatin1());  
  36. }  
  37.   
  38.   
  39. void TcpServer::newListen()  
  40. {  
  41.     if(!tcpServer->listen(QHostAddress::Any,8000))  
  42.         {  
  43.             qDebug()<<tcpServer->errorString();  
  44.             close();  
  45.             return;  
  46.         }  
  47. }  
  48.   
  49.   
  50. void TcpServer::acceptConnection()  
  51. {  
  52.     tcpSocket=tcpServer->nextPendingConnection();  
  53. }  
  54.   
  55.   
  56. void TcpServer::displayError(QAbstractSocket::SocketError)  
  57. {  
  58.     qDebug()<<tcpSocket->errorString();  
  59.     tcpSocket->close();  
  60. }  


三、实现结果
QT之不同主机之间TCP通信

QT之不同主机之间TCP通信点击打开链接

相关文章: