Qt:Python tcp客户端通过套接字发送数据。如何用Qt读取这些字节?

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,

情况: 我用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, 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);
    }
        */
    }