介绍 待补
QT网络编程——TCP服务器和客户端通信
Qt网络编程(1):QTcpSocket和QTcpServer的基本使用
介绍得非常清楚
有两种方式:
先说第一种
首先 QTcpSocket 最基本的功能
1、创建QTcpSocket对象,并用connectToHost()函数通过IP和端口号连接服务器。
tcpSocket = new QTcpSocket(this);
tcpSocket->connectToHost(ip,port); //根据IP地址和端口号连接服务器
2、客户端成功连接上服务器,系统会产生connected信号。(所以需要将信号和槽函数进行绑定)
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot())); //客户端连接服务器成功后会产生connected信号
3、客户端收到服务器发送来的数据,会产生readyRead信号,在connected信号对应的槽函数中,将readyRead信号和对应的槽函数进行绑定。
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //和服务器连接成功后,就需要就收服务器发送过来的数据了,
4、通过套接字对象读取服务器发来的数据。(用readall()等函数)
tcpSocket->readAll(); //从套接字中读取服务器发来的数据
5、通过套接字向服务器发送数据。(用write()函数)
tcpSocket->write(text); //向服务器发送数据
6、服务器断开连接,会发送disconnected信号
connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));
这里要做的稍微复杂一点
头文件
class Client : public QObject
{
Q_OBJECT
public:
Client();
~Client ();
void Connect(QString strServerIP, int nServerPort);//连接服务器
void ReConnect();//重新连接服务器
void Disconnect();
private:
QMutex m_lock;
QTcpSocket* m_pTcpSocket;
QTimer m_timerConnect;
QTimer m_timerReconnect;
QString m_strServerIP ;
QQueue<QString> m_QueueMess;//要发送的信息
int m_nServerPort;
}
要保持一直连接的状态
要考虑到:连不上自动重连;掉线自动重连的功能
这里用定时器实现以上功能
QTimer m_timerConnect;
连接服务器 Connect时开一个定时器 m_timerConnect。
在构造函数里:
m_timerConnect.setInterval(1000);
connect(&m_timerConnect, SIGNAL(timeout()), this, SLOT(OnTimerReconncet()));
m_pTcpSocket = new QTcpSocket(this);
connect(m_pTcpSocket, SIGNAL(connected()), this, SLOT(OnConnected()));
connect(m_pTcpSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));
先关闭套接字
abort 调用了 close, close 调用了 disconnectFromHost。 abort 立即关闭套接字,并丢弃写缓冲区中的所有待处理数据。close 关闭套接字的 IO,以及套接字的连接。
再连接服务器connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);
开启定时器
void Client::Connect(QString strServerIP, int nServerPort)
{
m_strServerIP = strServerIP;
m_nServerPort = nServerPort;
m_bCloseConnect = false;
//
m_pTcpSocket->abort();
m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);
m_timerConnect.start(3000);
}
关闭定时器,状态设置为已连接
//connect(m_pTcpSocket, SIGNAL(connected()), this, SLOT(OnConnected()));
void Client::OnConnected()
{
m_bConnected = true;
m_timerConnect.stop();
}
//到时间没有连上,触发定时器connect(&m_timerConnect, SIGNAL(timeout()), this, SLOT(OnTimerReconncet()));
void Client::OnTimerReconncet()
{
m_pTcpSocket->abort();
m_pTcpSocket->connectToHost(m_strServerIP, m_nServerPort, QTcpSocket::ReadWrite);
}
开启定时器
void CTcpClient::OnDisconnected()
{
m_bConnected = false;
m_timerReconnect.start();
}
向服务器发送消息调用
qint64 write(const char *data, qint64 len);
qint64 write(const char *data);
AddDataToSendQueue
m_lock.lock();
m_quueSendData.enqueue(strData);
m_lock.unlock();
emit sendData();
发送一个数据,开启时间循环。等待服务器返回消息。再返回结果