转自:http://blog.csdn.net/qivan/article/details/7460256
(1)篇里面代码没完全贴出,有些同学说没看明白。今天又闲的蛋疼,无聊弄个服务端跟客户端整在一个程序上的例子。
代码跟一篇有点相同,但是又有点不同。先贴出效果图。。。
为了效果明显,我一个在linux 下,一个在xp下运行。
代码如下:
头文件
- #ifndef NETWORKTCP_H
- #define NETWORKTCP_H
- #include <QMainWindow>
- #include <QtNetwork/QTcpServer>
- #include <QtNetwork/QTcpSocket>
- #include <map>
- #include <iostream>
- #include <QMessageBox>
- using namespace std;
- namespace Ui {
- class NetworkTcp;
- }
- class NetworkTcp : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit NetworkTcp(QWidget *parent = 0);
- ~NetworkTcp();
- QTcpServer *m_pTcpServer;
- QTcpSocket *m_pTcpSocket;
- map<int,QTcpSocket*> map_TcpSocket;
- QTcpSocket *pTcpSocketServer;
- QTcpSocket *pTcpSocketClient;
- bool isServer;
- private:
- Ui::NetworkTcp *ui;
- private slots:
- void slotStartServer();
- void slotConnectServer();
- void slotSendMesg();
- void slotNewConnect();
- void slotReadMesg();
- };
- #endif // NETWORKTCP_H
源文件
- #include "NetworkTcp.h"
- #include "ui_networktcp.h"
- NetworkTcp::NetworkTcp(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::NetworkTcp)
- {
- ui->setupUi(this);
- isServer= true; //默认服务端
- this->connect(ui->pushButton_StartServer,SIGNAL(clicked()),this,SLOT(slotStartServer()));
- this->connect(ui->pushButton_ConnectServer,SIGNAL(clicked()),this,SLOT(slotConnectServer()));
- this->connect(ui->pushButton_Send,SIGNAL(clicked()),this,SLOT(slotSendMesg()));
- }
- NetworkTcp::~NetworkTcp()
- {
- delete ui;
- }
- void NetworkTcp::slotStartServer() //启动服务器
- {
- isServer = true;
- ui->pushButton_ConnectServer->setEnabled(false);
- ui->lineEdit_IP->setEnabled(false);
- ui->lineEdit_NetPort->setEnabled(false);
- m_pTcpServer = new QTcpServer();
- m_pTcpServer->listen(QHostAddress::Any,19999);
- this->connect(m_pTcpServer,SIGNAL(newConnection()),this,SLOT(slotNewConnect()));
- }
- void NetworkTcp::slotNewConnect()
- {
- // QTcpSocket *pTcpSocket;
- pTcpSocketServer = m_pTcpServer->nextPendingConnection();
- // pTcpSocketTemp = pTcpSocket;
- // int sockfd = pTcpSocketTemp->socketDescriptor();
- // map_TcpSocket.insert(make_pair(sockfd,pTcpSocket));
- this->connect(pTcpSocketServer,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));
- }
- void NetworkTcp::slotReadMesg() //读取信息
- {
- // int sockfd = pTcpSocketTemp->socketDescriptor();
- if(isServer == true)
- {
- QByteArray qba= pTcpSocketServer->readAll(); //读取
- QString ss=QVariant(qba).toString();
- QHostAddress ip = pTcpSocketServer->peerAddress();
- QString qStrSendInfo = ip.toString()+" : "+ss;
- ui->textEdit_Info->append(qStrSendInfo);
- }
- else if(isServer == false)
- {
- QByteArray qba= pTcpSocketClient->readAll(); //读取
- QString ss=QVariant(qba).toString();
- QHostAddress ip = pTcpSocketClient->peerAddress();
- QString qStrSendInfo = ip.toString()+" : "+ss;
- ui->textEdit_Info->append(qStrSendInfo);
- }
- }
- void NetworkTcp::slotConnectServer() //连接服务器
- {
- if(ui->lineEdit_IP->text().isEmpty() ||ui->lineEdit_NetPort->text().isEmpty())
- {
- QMessageBox::warning(this,tr("Warning"),tr("Please input IP OR NetPort!"));
- return;
- }
- isServer = false;
- ui->pushButton_StartServer->setEnabled(false);
- pTcpSocketClient = new QTcpSocket(this);
- pTcpSocketClient->abort();
- QString qStrIP = ui->lineEdit_IP->text();
- quint16 netport = ui->lineEdit_NetPort->text().toInt();
- pTcpSocketClient->connectToHost(qStrIP,netport);
- connect(pTcpSocketClient,SIGNAL(readyRead()),this,SLOT(slotReadMesg()));
- }
- void NetworkTcp::slotSendMesg() //发送消息
- {
- QString strMesg= ui->lineEdit_sendmsg->text();
- ui->lineEdit_sendmsg->clear();
- if(isServer == true)
- {
- pTcpSocketServer->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));
- }
- else if(isServer == false)
- {
- pTcpSocketClient->write(strMesg.toStdString().c_str(),strlen(strMesg.toStdString().c_str()));
- }
- }
我一直想知道QQ发信息是怎么弄的,到现在还是没想明白里面的流程。。。唉。。。
希望懂的人一起交流交流。。。