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

QTcpSocket的一次奇异之旅

2017-02-09 22:22 573 查看
客户端与服务度取得连接,然后,

1.客户端做的就是,在连接建立后,打印当前时间,并立即向服务度发送数据;

2.服务端做的就是,在收到新的连接后,保存该socket,监听该socket的readyread信号,并向该socket发送数据。此时服务端也收到客户端发的数据,触发了readyread信号,因此服务端还向该socket发送了与客户端发来的一样的数据。

这时候,奇怪的事情就发生了,服务端发送了两条信息,但客户端收到的结果却不一样,有时是正确的两条信息,有时却是两条信息合并成一条。

相关的日志打印:

服务端:

OnNewConnection:  "22:26:20.169"

OnReadyRead:  "22:26:20.179"


客户端:

"22:26:20.176"


从上面的时间可以看出,数据发送的顺序是,客户端–服务端 ==> 服务端–客户端 ==> 服务端–客户端,服务端两条数据间隔了0.006秒,因此客户端接收到的有时候就是一条。

这种情况在10次里面出现了3次,暂时还没想到好的方法来规避,大家如果有什么好的办法,欢迎讨论。

附上相关代码:

服务端代码

void Server::OnNewConnection()
{
QTcpSocket *clientConnection = m_server->nextPendingConnection();
connect(clientConnection,SIGNAL(disconnected()),clientConnection,SLOT(deleteLater()));
connect(clientConnection,SIGNAL(readyRead()),this,SLOT(OnReadyRead()));

qDebug()<<"OnNewConnection: "<<QTime::currentTime().toString("hh:mm:ss.zzz");
clientConnection->write("Hello,New Client.I'm Server.");
}

void Server::OnReadyRead()
{
QTcpSocket *clientSocket = qobject_cast<QTcpSocket*>(sender());
qDebug()<<"OnReadyRead: "<<QTime::currentTime().toString("hh:mm:ss.zzz");
clientSocket->write(clientSocket->readAll());
}


客户端代码:

void Client::OnConnected()
{
qDebug()<<QTime::currentTime().toString("hh:mm:ss.zzz");
m_socket->write("Hello,I'm Client.");
}

void Client::OnReadyRead()
{
QByteArray ba = m_socket->readLine();

QString text = "Server: " + QString::fromLocal8Bit(ba);
ui->listWidget_History->addItem(text);
}


软件结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt qtcpsocket