在 python 中从服务器发送一些行到 QT(C++) 客户端
Posted
技术标签:
【中文标题】在 python 中从服务器发送一些行到 QT(C++) 客户端【英文标题】:Sending some lines from server in python to QT(C++) client 【发布时间】:2020-01-10 01:18:18 【问题描述】:我在我的 Raspberry Pi 和 QT (C++) 中的 android 应用程序上安装了 Python 中的 serwer。我想将一些数据(行)从我的服务器(来自 csv 文件)发送到客户端应用程序并将其保存在 QListWidget 中。客户端可以通过蓝牙或 TCP 连接(我在 RPi 上创建了 2 个服务器)。
我试图在循环中逐行发送,因为我不知道是否有任何方法可以发送整个列表或类似的东西。我在 Python 中阅读过有关 pickle 的内容,但我不知道我是否可以在 QT 中阅读此内容。
QT 中的客户:
if(typ=="BT") line = sBT->readLine();
if(typ=="TCP") line = sTCP->readLine();
line = line.trimmed();
while(line!="koniec")
ui->wflista->addItem(line);
if(typ=="BT") line = sBT->readLine();
if(typ=="TCP") line = sTCP->readLine();
line = line.trimmed();
Python 中的服务器:
if(data=="logi"):
globalvar.conn.send("logi\n")
print("Klient pyta o logi")
with open('/home/pi/Projekt/log.csv', 'rb') as logi:
csvreader = csv.reader(logi, delimiter=' ', quotechar='|')
for row in csvreader:
globalvar.conn.send(' - '.join(row)+"\n")
print('-'.join(row) +"\n")
globalvar.conn.send("koniec")
print("Wyslalem wszystko")
我想从 RPi 上的文件中获取行到我的 QListWidget (wflista),但不幸的是出了点问题。
当尝试执行此操作时,服务器会显示 csv 文件中的每一行和“Wysłałem wszystko”,因此它结束了循环。在客户端 QListWidget 是空的并且卡住了。我认为它处于无限循环中,因为它无法读取“koniec”(while 循环的参数。
如果我将这个参数从“koniec”更改为“”,它有时什么也不做,有时会得到应有的行,或者有时只得到一部分而部分丢失。
在这种情况下我该怎么办?
【问题讨论】:
您是否需要在globalvar.conn.send("koniec")
末尾的字符串中添加“\n”?我不知道您的 send()
函数是否会自动添加它(查看其他代码似乎不是)。 readLine()
不会检测到没有行尾存在的行。也似乎你想要一个canReadLine()
在某个地方(检查套接字是否真的有数据).. 但也许不是。
好吧,我知道“\n”是我的错。不幸的是它没有任何改变......我尝试了一些东西,我注意到当我在while循环中添加一个QMessageBox时它可以工作...... J必须单击Ok i消息框,但是当我在我的QListWidgets中这样做时会出现新元素。并且循环结束。这是什么意思?它读起来快吗?需要等待或什么?
【参考方案1】:
你能在 C++ 端尝试这样的事情,看看会发生什么吗? (这将代替您在问题中发布的整个 C++ 示例块。)
QIODevice *sock = (typ == "BT" ? qobject_cast<QIODevice*>(sBT) : qobject_cast<QIODevice*>(sTCP));
while (sock->canReadLine())
line = sock->readLine();
line = line.trimmed();
ui->wflista->addItem(line);
附:我假设这部分是由来自套接字的信号触发的,比如readyRead()
,或者放在waitForReadyRead()
之后。
添加:调试代码:
QIODevice *sock = (typ == "BT" ? qobject_cast<QIODevice*>(sBT) : qobject_cast<QIODevice*>(sTCP));
while (sock->bytesAvailable())
const QByteArray data = sock->readAll();
qDebug() << data << '\n' << data.toHex(':');
【讨论】:
是的,它是由 readyRead() 操纵的。情况是这样的:客户端按钮,它将命令发送到服务器,服务器 sens 命令触发了这段代码。我试图使用你的代码,但不幸的是我有一个错误:“不兼容的操作数类型('QBluetoothSocket *'和'QTcpSocket *')QIODevice *sock =(typ ==“BT”?sBT:sTCP);^~~~ ~~~~” 对,抱歉,这需要强制转换或分成多行。我编辑了代码,现在试试。 好的,在你编辑之后它可以工作,但不是alvays...有时它只读取数据的一部分,甚至什么也不读取。 什么都没有(你怎么知道)?或者你的意思是它打印一个空行?无论如何,我认为您需要进一步调试以查看您实际上通过套接字获得了什么。我添加了一个简单的示例(使用而不是readLine()
代码)。 toHex()
转储只是为了帮助更精确地检查内容。
好的,我使用了这个调试代码,我注意到了 3 种类型的结果。首先 - 我认为当一切正常时:在调试中出现所有行 第二 - 出现行,然后出现未完成的行,例如:line\nline\nline\nlin 第三个 - 像这样:“D libZamek.so:”31:34 :3a:36:42:3a:37:32:3a:39:44:3a:31:30:3a:32:42:28:4f:75:6b:69:74:65:6c:29:20 :2d:20:53:70:72:61:77:64:7a:65:6e:69:65:20:73:74:61:6e:75:20:72:79:67:6c:61 :20:2d:20:64:2e:30:39:2e:32:30:31:39:2c:20:31:33:3a:33:34:3a:33:39:0a:31:34 :3a:36:42:3a:37:32:3a:39:44:3a:31:30:3a:32:42:28:4f:75:6b:69:74:65:6c:29:20 :2d:20:53:70:72:61:77:64以上是关于在 python 中从服务器发送一些行到 QT(C++) 客户端的主要内容,如果未能解决你的问题,请参考以下文章
VoIP:如何在 Qt 多媒体中从摄像头捕获实时音频/视频流字节?