qt TCP 网络编程

qt 网络

介绍 待补
QT网络编程——TCP服务器和客户端通信

Qt网络编程(1):QTcpSocket和QTcpServer的基本使用
介绍得非常清楚

客户端

有两种方式:

  1. 继承QObject,QTcpSocket当作成员函数
  2. 继承QTcpSocket

先说第一种

QTcpSocket 成员变量

首先 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。

  1. 如果连上了,就关闭定时器
  2. 如果到时间 ,就尝试重新连接

在构造函数里:

  • 定时器槽函数
  • QTcpSocket 连接上的槽函数
  • QTcpSocket 断开的槽函数
	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);
  1. 直接发送数据:
    bool SendData(QString strData);
    {
    AddDataToSendQueue(strData);
    }

AddDataToSendQueue
m_lock.lock();
m_quueSendData.enqueue(strData);
m_lock.unlock();

emit sendData();
  1. 阻塞式发送

发送一个数据,开启时间循环。等待服务器返回消息。再返回结果

接收数据

你可能感兴趣的:(qt,网络,qt,tcp/ip)