您的位置:首页 > 理论基础 > 计算机网络

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

2012-04-14 11:53 573 查看
(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发信息是怎么弄的,到现在还是没想明白里面的流程。。。唉。。。

希望懂的人一起交流交流。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: