2017-08-25 7 views
0

として、私はタスクを簡素化することができるQt5で簡単なTCPサーバを書いた:QtのTcpSocket :: readyReadは、特定の状況では中triggerdない

  • が誰かの後にポート

  • の接続を待ちますそれに接続し、そこから文字列を読み込んで

  • はソケットを閉じて、次の接続

012をリッスン文字列を印刷

サーバーのコードは次のようである:

class Server:public QObject 
{ 
    Q_OBJECT 
public: 
    QTcpServer* TcpServer; 
    QTcpSocket* TcpSocket; 
    void Start(); 
public slots: 
    void OnConnection(); 
}; 


void Server::Start() 
{ 
    TcpServer = new QTcpServer(); 
    TcpServer->listen(QHostAddress::Any, 9999); 
    connect(TcpServer, &QTcpServer::newConnection, this, &Server::OnConnection); 
} 


void Server::OnConnection() 
{ 
    qDebug() << "connected"; 
    TcpSocket = TcpServer->nextPendingConnection(); 
    connect(TcpSocket, &QTcpSocket::readyRead, this, [=]() 
    { 
     qDebug() << "received:" << TcpSocket->readAll(); 
     TcpSocket->close(); 
    }); 
} 

その後、私はクライアントのために、このコードスニペットを持っている:私は、コンソールアプリケーションでそれを実行する場合

QTcpSocket socket; 
socket.connectToHost(QHostAddress::LocalHost, 9999); 
auto x = QString("Some information").toUtf8(); 
socket.write(x); 
socket.close(); 

このコードスニペットは、正常に動作します、あるいは私のプロジェクトで、ここでそれを実行します。ここでは

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; // main window of my application 
    w.show(); 

    QTcpSocket socket; 
    socket.connectToHost(QHostAddress::LocalHost, 9999); 
    auto x = QString("Some information").toUtf8(); 
    socket.write(x); 
    socket.close(); 

    return a.exec(); 
} 

は私が混乱します一部です:

メインウィンドウにはQPushButtonがあり、clicked信号がスロットに接続されています。このスロットでは、コードスニペットを含む関数を呼び出します。この関数は主にメインウィンドウのレイアウトを設定しています(私はQStackedWidgetを使用しました)。コードスニペットを実行すると、その動作が異なります。

サーバーのログから、ソケットがサーバーに接続できると思うが、QTcpSocket::readyReadはトリガーできないため、コードスニペットの5行がすべて実行されていてもサーバーは常にデータを待っている(私が提供するコードでは、サーバのログは以下のデータなしでのみ "接続"されます)。

サーバのQTcpSocket::readyReadをなぜこの機能に入れてもトリガできないのか分かりません。誰か説明できますか?

+0

クライアントソケットを閉じる前にhttp://doc.qt.io/qt-5/qiodevice.html#waitForBytesWrittenメソッド呼び出しを追加する必要があります。 – Macias

答えて

0

コンソールアプリケーションを書くとき、それはあなたがGUIをブロックに対処する必要はありませんので、いくつかの変更とスニペットを使用しても大丈夫です:-)私の質問を読んでいただきありがとうございます。あなたはGUI 1を書く場合は、信号を使用SHOLD、しかし
waitForConnected
waitForByttesWritten

:ちょうど次の方法を使用します。
最初にconnectToHostを呼び出した後、connected 信号を待ちます。次に、データを書き込むことができます。

その後、bytesWritten信号を待ち、bytesパラメータがwriteメソッドによって返された値と等しいことを確認してください。すべてがOKであれば、ソケットを閉じることができます。

関連する問題