首页 > 解决方案 > 在 python 中从服务器发送一些行到 QT(C++) 客户端

问题描述

Ia 在我的 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”更改为“”,它有时什么也不做,有时会得到应有的线条,或者有时只得到它的一部分而部分丢失。

在这种情况下我该怎么办?

标签: pythonqtsocketssend

解决方案


你能在 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);
}

PS我假设这部分是由来自套接字的信号触发的,比如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(':');
}

推荐阅读