QT 套接字等待用户输入

Posted

技术标签:

【中文标题】QT 套接字等待用户输入【英文标题】:QT socket wait for user input 【发布时间】:2020-05-29 08:27:17 【问题描述】:

我正在尝试开发一个具有基本身份验证的简单服务器, 我有以下代码:

socket = new QTcpSocket();
connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection);
check_user();

....... 和 check_user() 是

socket->write("Please enter username:");
socket->flush();
QStringList list;
while (socket->canReadLine())

    QString data = QString(socket->readLine());
    if ( data == "\r\n" )
        break;
    list.append(data);

qDebug()<<list;

但这不等待用户输入并走得更远。 我希望这个函数等待用户输入一个可变长度的字符串,直到回车。 但是怎么做?

【问题讨论】:

我已经在我的简单项目中做到了:github.com/bogdyname/Freechat/blob/master/Freechat/Network/… 【参考方案1】:

您可以将插槽连接到套接字的readyRead() 信号并在那里处理输入。 (https://doc.qt.io/qt-5/qiodevice.html#readyRead) 但要使其正常工作,您需要在套接字所在的线程中运行一个事件循环。 (https://doc.qt.io/archives/qt-4.8/qeventloop.html)

另一种解决方案是使用套接字的waitForReadyRead(-1)。这将阻塞线程并发出readyRead() 信号。如果信号被发出,该函数将返回true。但是您还需要一个正在运行的事件循环。 (https://doc.qt.io/qt-5/qabstractsocket.html#waitForReadyRead)

【讨论】:

我在 while 循环中添加了 socket->waitForReadyRead(-1) 但不会阻塞。并且 qstringlist 以空字符增长 在套接字所在的线程中是否有一个正在运行的事件循环和一个连接到readyRead() 信号的插槽? 是的,我有 exec();和connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection); 现在基本上你要做的就是调用连接到套接字的readyRead() 信号的插槽内的套接字的readLine() 并处理你读取的数据。跨度> 这样修改似乎可以工作 socket->write("请输入用户名:");套接字->冲洗(); QString 数据;永远 socket->waitForReadyRead(15000);数据 = QString(socket->readLine()); if (data.endsWith("\r\n")) 中断; qDebug()

以上是关于QT 套接字等待用户输入的主要内容,如果未能解决你的问题,请参考以下文章

Python asyncio:关闭套接字并释放等待 sock_read()

Qt中的整数用户输入

linux IO模型

Qt编程求助:有没有啥类似QDialog::exec()之类的能阻塞程序的方法?

习题10:等待用户输入input()

使用用户输入发送套接字GET请求的语法是什么