用python将一些行从服务器发送到QT(C+;+;)客户端

用python将一些行从服务器发送到QT(C+;+;)客户端,python,qt,sockets,send,Python,Qt,Sockets,Send,Ia在我的Raspberry Pi上有Python的serwer,在QT(C++)中有Android应用程序。我想从我的serwer(csv文件)向客户端应用程序发送一些数据(行),并将其保存在QListWidget中。客户端可以通过蓝牙或TCP连接(我在RPi上创建了两个服务器) 我试着在循环中一行一行地发送,因为我不知道是否有任何方法可以发送整个列表或类似的内容。我在Python中读到了关于pickle的内容,但我不知道是否可以在QT中读到 QT中的客户端: if(typ=="BT") li

Ia在我的Raspberry Pi上有Python的serwer,在QT(C++)中有Android应用程序。我想从我的serwer(csv文件)向客户端应用程序发送一些数据(行),并将其保存在QListWidget中。客户端可以通过蓝牙或TCP连接(我在RPi上创建了两个服务器)

我试着在循环中一行一行地发送,因为我不知道是否有任何方法可以发送整个列表或类似的内容。我在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”改为“有时它什么也不做,有时它应该得到行,有时它只得到一部分,而部分丢失了


<> P>这是什么?在/C++中,你可以尝试在C++方面尝试这样的事情吗?(看看这个问题会发生什么?)
您是否需要将“\n”添加到
globalvar.conn.send(“koniec”)
末尾的字符串中?我不知道您的
send()
函数是否会自动添加该字符串(查看其他代码,似乎不是)。
readLine()
将检测不到有行结尾的行。看起来您可能希望在其中的某个位置有一个
canReadLine()
(以检查套接字是否确实有数据)…但可能没有。好的,我知道“\n”这是我的错误。不幸的是,它没有改变任何东西…我尝试了一些东西,我注意到当我在while循环中添加一个QMessageBox时,它工作了…J必须单击Ok I MessageBox,但当我在我的QListWidgets中这样做时,它会出现新元素。循环结束。这意味着什么?它读得太快了?需要等待之类的东西吗?是的,它被readyRead()触发了。就是这样的情况:客户端按钮,它向serwer发送命令,而server sens命令触发了这段代码。我试图使用您的代码,但不幸的是,我出现了一个错误:“不兼容的操作数类型('QBluetoothSocket*'和'QTcpSocket*')QIODevice*sock=(typ===“BT”?sBT:sTCP)^ ~~~~~~~“好的,对不起,这需要一个强制转换或分成多行。我编辑了代码,现在就试试。好的,编辑后它会工作,但不是Always…有时它只读取一部分数据,甚至什么都不读取。什么都没有(你怎么知道)?或者你的意思是它打印一个空行?无论如何,我认为你需要进一步调试,看看你在套接字上实际得到了什么。我添加了一个简单的示例(使用而不是
readLine()
code)。使用
toHex()
dump只是为了帮助更精确地检查内容。好的,我使用了此调试代码,并注意到了3种类型的结果。首先-我认为当一切正常时:在调试中显示所有行,然后显示行,然后是未完成的行,例如:行\nline\nline\nlin和第三行-类似这样的内容:“D libZamek.so:”3:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:42:28:4f:75:6b:69:74:65:6c:29:20:2d:20:53:70:72:61:77:64
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);
}
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(':');
}