• 3925阅读
  • 4回复

请教一个很诡异很诡异的TCP问题。。 [复制链接]

上一主题 下一主题
离线16234655
 
只看楼主 正序阅读 楼主  发表于: 2011-05-24
这是我写的一段代码:

    if( flag == tr("end_the_game") )  //关键字: 游戏结束
    {  
        end_mark ++ ;

        bool ok(false);                //QString转成int
        score= QString(data).toInt(&ok);
        max_score=max_score>score? max_score:score;
    }

    if( end_mark == 2 )
    {
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_3);
    QString win( tr("You win!") ) ;
    QString lose( tr("I'm sorry , You lose!") ) ;
    QString result( tr("Result ") ) ;
    QString winwin( tr("Yes! You're win!") ) ;

            if(score<max_score)
            {  
                out <<result << lose  ; //自己赢了
                socket ->write(block);
                out.device()->seek(0);      
                
               for(int i=0;i<SocketList.count();i++)        
              {
                     TcpSocket *item= Server::SocketList.at(i);
                     if(socket ->socketDescriptor() != item->socketDescriptor() )
                    {
                            out <<result <<win ;
                            item->write(block);
                            out.device()->seek(0);              
                    }    
               } //for 给对方送去输了的信息。
            }

        else
          {    
               out<<result<<win ;
               socket ->write(block);
                out.device()->seek(0);      
                
               for(int i=0;i<SocketList.count();i++)        /*这里给对方送去改变的值*/
              {
                     TcpSocket *item= Server::SocketList.at(i);
                     if(socket ->socketDescriptor() != item->socketDescriptor() )
                    {       qDebug( "aasff") ;
                            out<<result<< lose ;
                            item->write(block);
                            out.device()->seek(0);              
                    }    
               } //for 给对方送去输了的信息。
            }
    end_mark = 0 ;
    max_score = 0 ;
    }  


用来判断两个客户端的结果。

奇怪的事情发生了,如果是输的一方先发,赢了的一方后发,客户端显示正常。
但是!!!如果是赢了的一方先发,输了的一方后发,就只能显示输了的一方的"sorry"真的好奇怪!!!
而且,如果把上述的第二种情况的win,改成lose,居然又可以显示两边“lose”~~~~~~奇怪啊!!!
离线16234655
只看该作者 4楼 发表于: 2011-05-24
问题已解决,是我不小心没删掉out.device()->seek(0);  导致客户端空循环。
离线16234655
只看该作者 3楼 发表于: 2011-05-24
嗯,而且通过检验,虽然循环只进行了一次,但是不知道为什么,客户端读了两遍,而且是空字符。
下面是我的客户端读取的代码:

void TripPlanner::updatelistening()
{   qDebug("Check how many times ") ;
    while (tcpSocket.bytesAvailable()>0)
    {
    QDataStream in(&tcpSocket);
    in.setVersion(QDataStream::Qt_4_3);
    tableWidget->setRowCount(1);
    QString analy ;
    
    in >> analy ;
    qDebug() << analy ;
        QString location ;
        in >> location ;
        qDebug() << location ;
        tableWidget->setItem(0, 0,
            new QTableWidgetItem(analy)); //第二个参数是设置位置的
        tableWidget->setItem(0, 1,
            new QTableWidgetItem(location));
    }

}

DEBUG:

“Scoresystem.exe”: 已加载“C:\Windows\System32\WSHTCPIP.DLL”
Check how many times
"Result"
"I'm sorry , You lose!"
Check how many times
"Result"
"You win!"
""
""
离线16234655
只看该作者 2楼 发表于: 2011-05-24
在线等,在线等
离线16234655
只看该作者 1楼 发表于: 2011-05-24
QList里面是socket链,存着两个socket。而且上面的if是自己赢了的情况。

着急着急。。。。请各位帮助我!
快速回复
限100 字节
 
上一个 下一个