找回密码
 立即注册
收起左侧

QT tcp 通讯问题,服务端发送了一个字符,客服端回送该字

3
回复
7239
查看
[复制链接]
累计签到:3 天
连续签到:1 天
来源: 2015-1-22 17:02:13 显示全部楼层 |阅读模式
5Qter豆
一开始,给客服端发送一个字符A,客服端收到该字符并回送该字符,服务端收到后,判断发送的与接收的字符一致,一致发送字符B,字符B 和字符A一个样,有个回送和判断的过程,但现在 字符A可以发送,也能回收,但执行到发送字符B时,qDebug输出,chB 的大小为7 说明,写进去了,但客服端接收的是空,回送的也是空。为什么?
void Server::sendCharacterA()
{

   // c = wsFrame[1085];
   // const qint16 chType = 1;
    QDataStream out(&chA, QIODevice::WriteOnly);
    out.setVersion(QDataStream:t_4_7);
    out << (qint16)0;

    out << c;
    qDebug()<<chA.size();
    //qDebug()<<chA;
    out.device()->seek(0);
    out << (qint16)( chA.size() - sizeof(qint16) );
    tcpServerConnection->write(chA);

    //recvCharacterA();
    //emit characterReturnA(ch)
    chA.resize(0);
    //connect( tcpServerConnection, SIGNAL(readyRead()), this, SLOT( recvCharacterA()) );
    if( tcpServerConnection->waitForReadyRead() == false )
    {
        return;
    }
    else
    {
        recvCharacterA();
    }
void Server::recvCharacterA()
{

    //QByteArray result = sendCharacterA();
    QDataStream in(tcpServerConnection);
    in.setVersion(QDataStream:t_4_7);
    if( blockSize == 0 )
    {
        //ui->serverStatusLabel->setText(tr("接收字符A函数执行"));
        if( tcpServerConnection->bytesAvailable() < (int)sizeof(qint16) )return;

        in >> blockSize;

    }
    //qDebug()<<blockSize;
    if( tcpServerConnection->bytesAvailable() < blockSize )return ;

    in >> recvChA;
    //qDebug()<<recvChA.size();
    qDebug()<<recvChA;
    qDebug()<<tr("haha");
    ui->serverStatusLabel->setText(recvChA);
    if( recvChA != c )
    {
        sendCharacterA();
    }
    else
    {
        qDebug()<<tr(" hello");
        sendCharacterB();
    }
void Server::sendCharacterB()
{
    b = "B" ;
    QDataStream out(&chB, QIODevice::WriteOnly);
    out.setVersion(QDataStream:t_4_7);
    out << (qint16)0<<b;
    //qDebug()<<b;
    out.device()->seek(0);
    out << (qint16)( chB.size() - sizeof(qint16) );
    qDebug()<<chB.size();


    tcpServerConnection->write(chB);


    //chB.resize(0);
    //recvCharacterB();
    if( tcpServerConnection->waitForReadyRead() == false )
    {
        return;
    }
    else
    {
        recvCharacterB();
    }
    qDebug()<<tr("QT");
}
void Server::recvCharacterB()
{
   // qDebug()<<tr(" nima ");
    //QByteArray resultB = sendCharacterB();
    QDataStream in(tcpServerConnection);
    in.setVersion(QDataStream:t_4_7);
    if( BblockSize == 0 )
    {
        if( tcpServerConnection->bytesAvailable() < (int)sizeof(qint16) )return;
        in >> BblockSize;
    }
    if( tcpServerConnection->bytesAvailable() < BblockSize )return ;

    in >> recvChB;
    qDebug()<<recvChB;
    qDebug()<<tr("GG");

    if( recvChB != b )//回送的字符与发送的字符是否一致
    {
         sendCharacterB();
    }
    else
    {
        ui->serverStatusLabel->setText( tr("可以发送握手帧"));
        sendWsFrame( );
    }
    //recvChB=0;

}


最佳答案

查看完整内容

建议只写一个发送函数和一个接收函数,然后把程序写规范一点,先实现发送字符A,接收字符A,然后再通过判断语句添加发送和接收字符B的代码。 最后应该能正常实现,即便有问题,相信你也可以自己解决的。
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2015-1-22 17:02:14 显示全部楼层
建议只写一个发送函数和一个接收函数,然后把程序写规范一点,先实现发送字符A,接收字符A,然后再通过判断语句添加发送和接收字符B的代码。

最后应该能正常实现,即便有问题,相信你也可以自己解决的。
回复

使用道具 举报

累计签到:7 天
连续签到:1 天
2015-1-27 20:35:38 显示全部楼层
yafeilinux 发表于 2015-1-22 22:48
建议只写一个发送函数和一个接收函数,然后把程序写规范一点,先实现发送字符A,接收字符A,然后再通过判断 ...

嗯,大神的解决思路简单清晰明了,不愧是出书的牛人啊,膜拜!
回复

使用道具 举报

累计签到:7 天
连续签到:1 天
2015-1-27 20:36:54 显示全部楼层
我开源过一个类似的工具,看这里:http://www.qter.org/forum.php?mo ... tid=1179&extra=
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了