として、私はタスクを簡素化することができるQt5で簡単なTCPサーバを書いた:QtのTcpSocket :: readyReadは、特定の状況では中triggerdない
が誰かの後にポート
の接続を待ちますそれに接続し、そこから文字列を読み込んで
はソケットを閉じて、次の接続
サーバーのコードは次のようである:
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
をなぜこの機能に入れてもトリガできないのか分かりません。誰か説明できますか?
は
クライアントソケットを閉じる前にhttp://doc.qt.io/qt-5/qiodevice.html#waitForBytesWrittenメソッド呼び出しを追加する必要があります。 – Macias