0

C++ でクライアントを作成し、Python でサーバーを作成しています。

サーバーはクライアントからの接続を受け入れ、正規表現 "id\s\d" でフォーマットされたプレーヤー ID 番号をクライアントに送信します。(例: "id 3")

 if s is serversocket:
            print "Listening..."
            if accept_connection or nb_player < 5:
                connection, client_address = s.accept();
                print 'New connection from ', client_address
                connection.setblocking(0)
                inputs.append(connection)
        # Send player I to new connection
        connection.send("id "+str(len(inputs)-1))

クライアントはソケットを初期化し、接続します。connected()メッセージが出力された場合、GUIにメッセージを表示するように実装しました。問題なく排出されます。サーバー側でも同じで、問題なく接続できます。

Window::Window(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Window)
{
    ui->setupUi(this);

    /* Initialize socket */
    socket = new QTcpSocket(this);
    socket->connectToHost("localhost", 13456);

    connect(socket, SIGNAL(readyRead()), this, SLOT(data_received()));
    connect(socket, SIGNAL(connected()), this, SLOT(connected()));
}

サーバーはクライアントから問題なくデータを受信します。情報を正しく受け取らないのはクライアントです。

void Window::data_received(){

    QRegExp id_re("id\\s(\\d)");

    while (socket->canReadLine()){
        /* Read line in socket (UTF-8 for accents)*/
        ui->log->append("listening...");
        QString line = QString::fromUtf8(socket->readLine()).trimmed();

        /* Player ID returned by server */
        if ( id_re.indexIn(line) != -1){
            //Test
            ui->log->append("The ID arrived");
            //Extract ID
            QString id_str = id_re.cap(1);
            //Put in data structure of player
            player->set_player_id(id_str);
            //Display message
            ui->log->append(QString("You are Player "+ player->get_player_id()));

        }
    }
}

get_player_id()を返しますQString

問題を特定しましたが、canReadLine() が true を返すことはないようです。したがって、それを読み取ることはできません。何が原因でしょうか?

4

1 に答える 1

1

canReadLine()探すからです"\n"。Python は自動的に追加しないため、文字列に行末がありませんでした。"\n"Pythonコードを追加するだけで問題が解決しました。

于 2012-11-06T06:19:29.930 に答える