Qt:Python tcp客户端通过套接字发送数据。如何用Qt读取这些字节?
情况: 我用Python制作了tcp客户端,用Qt制作了tcp服务器。我试图用我的客户端发送字节,但我无法让Qt服务器读取这些字节 使用Python制作的客户机和服务器,一切正常。此外,我还可以让我的Python客户机与C#server一起工作,不会出现任何问题 Python客户端的代码:Qt:Python tcp客户端通过套接字发送数据。如何用Qt读取这些字节?,python,debugging,qt,sockets,tcp,Python,Debugging,Qt,Sockets,Tcp,情况: 我用Python制作了tcp客户端,用Qt制作了tcp服务器。我试图用我的客户端发送字节,但我无法让Qt服务器读取这些字节 使用Python制作的客户机和服务器,一切正常。此外,我还可以让我的Python客户机与C#server一起工作,不会出现任何问题 Python客户端的代码: import socket import sys HOST = 'localhost' PORT = 50505 try: sock = socket.socket(socket.AF_INET,
import socket
import sys
HOST = 'localhost'
PORT = 50505
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as msg:
sys.stderr.write("[ERROR] %s\n" % msg)
sys.exit(1)
try:
sock.connect((HOST, PORT))
except socket.error as msg:
sys.stderr.write("[ERROR] %s\n" % msg)
sys.exit(2)
sock.send(b'Hello World!\r\n')
我尝试过e.q fortuneserver/fortuneclient代码示例,但都不起作用。Bytesavailable()始终为0
所以问题是如何在我的Qt应用程序中读取“Hello World!”行?我只需要在服务器发出newConnection()信号时启动的函数
更新:
Qt服务器的部分代码:
void Server::startRead()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
QString ipAddress;
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;
QString nextFortune;
in >> nextFortune;
statusLabel->setText(nextFortune);
ABOVE IS FROM FORTUNE CLIENT EXAMPLE.
BELOW IS FROM ANOTHER EXAMPLE.
/*
char buffer[128] = {0};
QTcpSocket *client = tcpServer->nextPendingConnection();
qDebug() << client->bytesAvailable();
for (int i=0; i<100; i++)
{
client->read(buffer, client->bytesAvailable());
qDebug() << buffer;
std::string sString(buffer);
QString qString(sString.c_str());
statusLabel->setText(qString);
}
*/
}
void服务器::startRead()
{
QDataStream-in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
QString IP地址;
如果(块大小==0){
if(tcpSocket->bytesavable()<(int)sizeof(quint16))
返回;
在>>块大小中;
}
if(tcpSocket->bytesavable()>下一次灾难中;
statusLabel->setText(下一个事件);
以上是《财富》杂志的客户示例。
下面是另一个例子。
/*
字符缓冲区[128]={0};
QTcpSocket*client=tcpServer->nextPendingConnection();
qDebug()字节可用();
对于(inti=0;iread(缓冲区,客户端->字节可用());
qDebug()setText(qString);
}
*/
}
最后一部分相当糟糕。我试图制作一些东西,但我不知道我在用Qt做什么:)您附加的服务器代码是这样工作的:每个“数据包”(逻辑数据包)由一个
大小
字段组成,然后是大小
值的数据
基本上是这样的:
quint16
有足够的字节可读取,请等待
更多quint16
read,等待
至少为quint16
待阅读在我们了解了这一点之后,即使您按照服务器的预期写入数据包长度,您尝试执行的操作仍然无法正常工作。这是因为服务器从套接字读取
QString
的方式不同。客户端正在编写一个原始python字符串,我猜它只是在向套接字写入一个普通的旧ASCII。服务器正在使用QDataStream
从套接字读取数据(这是在Qt中序列化的标准方式)。如果您查看QString
操作符的实现,您附加的服务器代码是这样工作的:每个“数据包”(逻辑数据包)都由一个size
字段组成,然后是size
值的数据
基本上是这样的:
quint16
有足够的字节可读取,请等待
更多quint16
read,等待
至少为quint16
待阅读在我们了解了这一点之后,即使您按照服务器的预期写入数据包长度,您尝试执行的操作仍然无法正常工作。这是因为服务器从套接字读取
QString
的方式不同。客户端正在编写一个原始python字符串,我猜它只是在向套接字写入一个普通的旧ASCII。服务器正在使用QDataStream
从套接字读取数据(这是在Qt中序列化的标准方式)。如果您查看QString
运算符的实现,则需要安排代码在有数据可用时读取。根据您的描述,当startRead()运行时,还没有可用的数据
我假设您调用了qtcserver::nextPendingConnection
以在startRead()
中获取tcpSocket
?如果没有,你需要这样做
只需将tcpSocket
或客户端的readyRead
信号连接到doRead()
插槽,然后选中bytesavable()
并在该插槽中读取
每当新数据到达时,就会调用此插槽
您可能还对TCP套接字发出的disconnected()
信号感兴趣,以了解发送数据的时间。您需要安排代码在有数据可用时读取。根据您的描述,当startRead()运行时,还没有可用的数据
我假设您调用了qtcserver::nextPendingConnection
以在startRead()
中获取tcpSocket
?如果没有,你需要这样做
只需将tcpSocket
或客户端的readyRead
信号连接到doRead()
插槽,然后选中bytesavable()
并在该插槽中读取
每当新数据到达时,就会调用此插槽
您可能还对来自TCP套接字的disconnected()
信号感兴趣,以了解何时完成数据发送。您的客户端代码看起来很好(除了缩进消息)。你能在服务器端发邮件吗?如果您尝试使用同一个客户机从web上的随机http服务器获取某些内容,它就可以正常工作。还有,QT和这整件事有什么关系?这是一个GUI工具包。@Ibrahim-Qt不是GUI工具包。这是一个应用框架。啊,好的。谢谢但是,如果没有服务器端代码,我认为这是不可调试的。肯定需要服务器端代码来提供有用的建议。您的客户端代码看起来很好(除了缩进提示)。你能在服务器端发邮件吗?如果您尝试使用同一个客户机从web上的随机http服务器获取某些内容,它就可以正常工作。还有,QT和这整件事有什么关系?这是一个GUI工具包。@Ibrahim-Qt不是GUI工具包。这是一个应用框架。啊,好的。谢谢但是,如果没有服务器端代码,我认为这是不可调试的。肯定需要服务器端代码来提供有用的建议。
void Server::startRead()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
QString ipAddress;
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;
QString nextFortune;
in >> nextFortune;
statusLabel->setText(nextFortune);
ABOVE IS FROM FORTUNE CLIENT EXAMPLE.
BELOW IS FROM ANOTHER EXAMPLE.
/*
char buffer[128] = {0};
QTcpSocket *client = tcpServer->nextPendingConnection();
qDebug() << client->bytesAvailable();
for (int i=0; i<100; i++)
{
client->read(buffer, client->bytesAvailable());
qDebug() << buffer;
std::string sString(buffer);
QString qString(sString.c_str());
statusLabel->setText(qString);
}
*/
}