在 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 多媒体中从摄像头捕获实时音频/视频流字节?

如何在扭曲的python中从服务器发送列表中的内容?

打印文件中从匹配行到文件末尾的行数

使用 Pivot 在 MySQL 8.0.17 版中从不同表和不同行号(联合)进行行到列转换

C ++ Qt - 仅在最后一个回复完成后发送POST请求

QT错误中的C ++线程亲和力