当前位置:   article > 正文

Qt TCP通信(QTcpSocket)

qtcpsocket

1. 用法

下面以初始化、连接、写、读、断开连接这几个部分来介绍QTcpSocket的用法。
假设在xxx类实现tcp通信。

初始化

/* 初始化 */
void xxx::init() {
	m_socket = new QTcpSocket(this);

	/*下面是几种常用的信号,更多的信号可以查看QAbstractSocket和QIODevice文档*/
	connect(m_socket, &QTcpSocket::connected, this, [] () {
		qDebug() << "socket已连接";
	});

	connect(m_socket, &QTcpSocket::disconnected, this, [] () {
		qDebug() << "socket已断开连接";
	});

	connect(m_socket, &QTcpSocket::stateChanged, this, [] (QAbstractSocket::SocketState socketState) {
		qDebug() << "socket状态改变" << socketState;
	});

	connect(m_socket, &QTcpSocket::readyRead, this, [] () {
		qDebug() << "有数据可读";
	});
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

连接

/* 初始化 */
bool xxx::connect() {
	m_socket->connectToHost(m_ip, m_port); //连接
	
	/* 等待连接完成,设置连接超时为500ms,超时视为连接失败 */
    return m_socket->waitForConnected(500); 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

发送

/* 发送数据 */
bool xxx::send(const QByteArray &byteArray) {
	if (m_socket->write(byteArray) == -1) {
		/* 写数据时出现错误 */
		qDebug() << m_socket->errorString(); //错误的详情
		return false;
	}

    if (!m_socket->waitForBytesWritten(500)) {//等待发送完毕,设置超时时间500ms
        /* 限定时间内没发完 */
        return false;
    }
	
	return true;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接收

/* 接收数据 */
QByteArray xxx::receive() {
	/* readAll返回空的数据不一定代表有错,该方法无法判断是否出错 */
	return m_socket->readAll();
}
  • 1
  • 2
  • 3
  • 4
  • 5

断开连接

/* 接收数据 */
void xxx::disconnect() {
	/** 写法一 
	 * 该方法调用后会开始断开连接。
	 * 要注意的是,调用这个方法后,不会马上断开连接,
	 * 它会等待数据写入完成后才会真正断开,如果数据一直写不完就一直断不开
	 * 比如拔了网线,就一直写不进去,这时候调用这个方法是无效的,
	 * socket状态一直为ClosingState。
	 */
	m_socket->disconnectFromHost();	//

	/** 写法二 
	 * 该方法调用后会立马断开连接。
	 */
	m_socket->abort();  
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.应用

判断连接是否断开

1、发送数据时,一次或多次发送超时,可以判断为断开连接。
2、心跳包检测(每隔一段时间发送一条无意义的数据,根据发送结果确认连接状态),TCP连接一般都要加上这条,不然如果长时间无数据发送,连接会被自动关闭。
注:检测到断开连接最好调用abort来断开socket上的连接,原因在上一节已有说明。

同步操作

QTcpSocket的方法是异步的,调用了函数,不会马上返回结果,Qt通过信号来异步返回结果,但有时候需要同步得到结果,对此,QTcpSocket提供了以下函数,可以阻塞线程,直到指定的信号被触发。

bool waitForConnected(int msecs = 30000); //阻塞线程,直到连接完成或超时。
bool waitForReadyRead(int msecs = 30000); //阻塞线程,直到有新数据可读取或超时。
bool waitForBytesWritten(int msecs = 30000); //阻塞线程,直到数据被写入socket或超时。
bool waitForDisconnected(int msecs = 30000); //阻塞线程,直到断开连接或超时。
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1016707
推荐阅读
相关标签
  

闽ICP备14008679号