Qt之QTcpServer/QTcpSocket简单收发信息(2)

转自:http://blog.csdn.net/qivan/article/details/7460256

(1)篇里面代码没完全贴出,有些同学说没看明白。今天又闲的蛋疼,无聊弄个服务端跟客户端整在一个程序上的例子。

 

代码跟一篇有点相同,但是又有点不同。先贴出效果图。。。

 

 

为了效果明显,我一个在linux 下,一个在xp下运行。

 

代码如下:

头文件

[cpp]  view plain  copy
  1. #ifndef NETWORKTCP_H  
  2. #define NETWORKTCP_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QtNetwork/QTcpServer>  
  6. #include <QtNetwork/QTcpSocket>  
  7. #include <map>  
  8. #include <iostream>  
  9. #include <QMessageBox>  
  10. using namespace std;  
  11.   
  12. namespace Ui {  
  13.     class NetworkTcp;  
  14. }  
  15.   
  16. class NetworkTcp : public QMainWindow  
  17. {  
  18.     Q_OBJECT  
  19.   
  20. public:  
  21.     explicit NetworkTcp(QWidget *parent = 0);  
  22.     ~NetworkTcp();  
  23.   
  24.     QTcpServer *m_pTcpServer;  
  25.     QTcpSocket *m_pTcpSocket;  
  26.     map<int,QTcpSocket*> map_TcpSocket;  
  27.   
  28.       QTcpSocket *pTcpSocketServer;  
  29.       QTcpSocket *pTcpSocketClient;  
  30.   
  31.     bool isServer;  
  32. private:  
  33.     Ui::NetworkTcp *ui;  
  34.   
  35. private slots:  
  36.     void slotStartServer();  
  37.     void slotConnectServer();  
  38.     void slotSendMesg();  
  39.     void slotNewConnect();  
  40.     void slotReadMesg();  
  41. };  
  42.   
  43. #endif // NETWORKTCP_H  


源文件

 

[cpp]  view plain  copy
  1. #include "NetworkTcp.h"  
  2. #include "ui_networktcp.h"  
  3.   
  4. NetworkTcp::NetworkTcp(QWidget *parent) :  
  5.         QMainWindow(parent),  
  6.         ui(new Ui::NetworkTcp)  
  7. {  
  8.     ui->setupUi(this);  
  9.     isServer= true;     //默认服务端  
  10.     this->connect(ui->pushButton_StartServer,SIGNAL(clicked()),this,SLOT(slotStartServer()));  
  11.     this->connect(ui->pushButton_ConnectServer,SIGNAL(clicked()),this,SLOT(slotConnectServer()));  
  12.     this->connect(ui->pushButton_Send,SIGNAL(clicked()),this,SLOT(slotSendMesg()));  
  13. }  
  14.   
  15. NetworkTcp::~NetworkTcp()  
  16. {  
  17.     delete ui;  
  18. }  
  19.   
  20.   
  21. void NetworkTcp::slotStartServer()  //启动服务器  
  22. {  
  23.     isServer = true;  
  24.     ui->pushButton_ConnectServer->setEnabled(false);  
  25.     ui->lineEdit_IP->setEnabled(false);  
  26.     ui->lineEdit_NetPort->setEnabled(false);  
  27.     m_pTcpServer = new QTcpServer();  
  28.     m_pTcpServer->listen(QHostAddress::Any,19999);  
  29.     this->connect(m_pTcpServer,SIGNAL(newConnection()),this,SLOT(slotNewConnect()));  
  30. }  
  31.   
  32. void NetworkTcp::slotNewConnect()  
  33. {  
  34. //    QTcpSocket *pTcpSocket;  
  35.     pTcpSocketServer =  m_pTcpServer->nextPendingConnection();  
  36. //    pTcpSocketTemp = pTcpSocket;  
  37. //    int sockfd = pTcpSocketTemp->socketDescriptor();  
  38. //    map_TcpSocket.insert(make_pair(sockfd,pTcpSocket));  
  39.     this->connect(pTcpSocketServer,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));  
  40. }  
  41.   
  42. void NetworkTcp::slotReadMesg() //读取信息  
  43. {  
  44. //    int sockfd = pTcpSocketTemp->socketDescriptor();  
  45.     if(isServer == true)  
  46.     {  
  47.         QByteArray qba= pTcpSocketServer->readAll(); //读取  
  48.   
  49.         QString ss=QVariant(qba).toString();  
  50.         QHostAddress ip = pTcpSocketServer->peerAddress();  
  51.         QString qStrSendInfo = ip.toString()+" : "+ss;  
  52.         ui->textEdit_Info->append(qStrSendInfo);  
  53.   
  54.     }  
  55.     else if(isServer == false)  
  56.     {  
  57.         QByteArray qba= pTcpSocketClient->readAll(); //读取  
  58.         QString ss=QVariant(qba).toString();  
  59.         QHostAddress ip = pTcpSocketClient->peerAddress();  
  60.         QString qStrSendInfo = ip.toString()+" : "+ss;  
  61.         ui->textEdit_Info->append(qStrSendInfo);  
  62.   
  63.     }  
  64. }  
  65.   
  66. void NetworkTcp::slotConnectServer()    //连接服务器  
  67. {  
  68.     if(ui->lineEdit_IP->text().isEmpty() ||ui->lineEdit_NetPort->text().isEmpty())  
  69.     {  
  70.         QMessageBox::warning(this,tr("Warning"),tr("Please input IP OR NetPort!"));  
  71.         return;  
  72.     }  
  73.   
  74.     isServer = false;  
  75.     ui->pushButton_StartServer->setEnabled(false);  
  76.     pTcpSocketClient = new QTcpSocket(this);  
  77.     pTcpSocketClient->abort();  
  78.     QString qStrIP = ui->lineEdit_IP->text();  
  79.     quint16 netport = ui->lineEdit_NetPort->text().toInt();  
  80.     pTcpSocketClient->connectToHost(qStrIP,netport);  
  81.   
  82.     connect(pTcpSocketClient,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));  
  83.   
  84. }  
  85.   
  86. void NetworkTcp::slotSendMesg() //发送消息  
  87. {  
  88.     QString strMesg= ui->lineEdit_sendmsg->text();  
  89.     ui->lineEdit_sendmsg->clear();  
  90.     if(isServer == true)  
  91.     {  
  92.   
  93.          pTcpSocketServer->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));  
  94.     }  
  95.   
  96.     else if(isServer == false)  
  97.     {  
  98.          pTcpSocketClient->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));  
  99.     }  
  100.   
  101. }  


 

我一直想知道QQ发信息是怎么弄的,到现在还是没想明白里面的流程。。。唉。。。

希望懂的人一起交流交流。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值