Python 3 套接字和 QTcpsocket (c++) 之间的通信失败

用户3701175

当前使用 Qt 的 QTcpsocket 库和 python 3 的套接字类。我已经得到了 Qt 的 C++ Fortune 客户端/服务器示例来正确构建和运行。但是,它适用于都是 C++ 的客户端和服务器。要求是服务器正在运行 Python。

# Server.py


import socket

# ...
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 45000)
sock.listen(1) # queuing up 1 request for now.

(clientsocket, address) = sock.accept() # waits until client connects.

chunk = clientsocket.recv(1024).decode() # client is now connect
print(chunk) #prints out message from client

msg = "Hello from the server"
msg = str.encode(msg)

# send the message back to the client
clientsocket.sendall(msg)

// Client.h

#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include <QtNetwork/QtNetwork>

class Client : public QObject {
     Q_OBJECT
public:
     Client();
     QTcpSocket *m_socket;
     QHostAddress m_serverAddr = QHostAddress("127.0.0.1");
     quint16 m_serverPort = 45000;
private:
     QDataStream m_dataStream;
     void testConnect();
};
#endif

// client.cpp

Client::Client() {
    m_socket = new QTcpSocket(this);
    m_dataStream.setDevice(m_socket);
    m_dataStream.setVersion(QDataStream::Qt_4_0);
    testConnect();

}

void Client::testConnect() {
        m_socket->abort(); // if m_socket is not already connected, this does nothing
        m_socket->connectToHost(m_serverAddr, m_serverPort);
        if (m_socket->waitForConnected(30000)) {
            qDebug() << "Connected to server...";
            m_socket->write("Hello server from client"); // is received!
            m_socket->waitForBytesWritten();
            m_socket->waitForReadyRead();
            qDebug() << "Reading: " << m_socket->bytesAvailable();
            m_dataStream.startTransaction();
            QString nextFortune;
            m_dataStream >> nextFortune;
            if (!m_dataStream.commitTransaction()) {
                qDebug() << "Read errors have occurred."; // prints when connected to python server. not desired behavior
                m_socket->close();  
                return;              

            }
            // This prints when running the Qt fortune c++ server, but not the python server (above).
            qDebug() << "No read errors occurred during read transactions.";
            qDebug() << nextFortune;
        }

}

最终发生的是服务器毫无问题地从客户端接收消息,但是当服务器尝试使用 发送回复时clientsocket.sendall(msg)m_dataStream.commitTransaction()返回false。我最初的直觉是 python 端的编码是错误的。QDataStream 是否需要特殊编码?

QDataStream::commitTransaction() 的文档:

bool QDataStream::commitTransaction()

完成一个读事务。true如果在事务期间没有发生读取错误,则返回否则返回false

此外,运行后,这里是 C++ 客户端的输出:

Connected to server...
Reading: 25
Read errors have occurred.
奇克

当您想使用QDataStreamwith 运算符时,>>您必须遵循序列化格式。调用QDataStream.setVersion()选择具体格式。

我已经能够找到的记录仅12版(从应用QDataStream::Qt_4_6QDataStream::Qt_4_9)和版本13QDataStream::Qt_5_0)。

版本 12 和 13 具有相同的 QString 序列化格式:

> 如果字符串为空:0xFFFFFFFF (quint32)

> 否则:以字节为单位的字符串长度 (quint32) 后跟 UTF-16 格式的数据

当您调用m_dataStream >> nextFortune它时,预计传入的数据将采用上述格式。

Python 中用于发送编码的代码QString如下所示:

import struct

msg = "Hello from the server".encode("utf-16be")
clientsocket.sendall(struct.pack(">I", len(msg)) + msg)
  • str.encode("utf-16be") - 以大端顺序将字符串编码为 UTF-16
  • struct.pack(">I", len(msg))-创建一个32位无符号整数包含编码的字符串的长度(I在大端orderd)( >

发送到 Qt 客户端的所有数据都是大端顺序,因为它是QDataStream使用的隐式顺序

我已经用 Qt 5.9 和序列化版本测试了代码QDataStream::Qt_4_0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python,Windows 和 Raspberry pi 3 之间的套接字

来自分类Dev

C#和Java套接字之间的通信停止了吗?

来自分类Dev

Android和C ++套接字通信

来自分类Dev

Python 3多处理和套接字

来自分类Dev

Python和TCL之间的套接字连接

来自分类Dev

PHP和C ++之间的套接字连接

来自分类Dev

python和C ++之间的通信

来自分类Dev

C ++和Python之间的通信

来自分类Dev

我尝试在Ruby和C之间编写Unix域套接字通信脚本

来自分类Dev

在C ++和Node.js之间建立套接字通信的困难(服务器)

来自分类Dev

我尝试在Ruby和C之间编写Unix域套接字通信脚本

来自分类Dev

Java和C#应用程序之间的套接字通信

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

Windows 和 Linux 之间的 Python 套接字连接

来自分类Dev

C ++套接字:通过Internet在PC之间进行通信

来自分类Dev

Python 3 套接字 - 我可以在停止和重新运行程序时保持套接字打开吗?

来自分类Dev

python套接字和epoll

来自分类Dev

套接字和线程python

来自分类Dev

套接字和线程python

来自分类Dev

python套接字和epoll

来自分类Dev

在C ++插件和Python程序之间进行通信

来自分类Dev

Swift iOS和Java套接字之间的TCP通信

来自分类Dev

通过套接字python3发送和接收数据

来自分类Dev

如何使用 Python 3、套接字和代理 (TOR) 获取我的 IP?

来自分类Dev

通过套接字以字节[]的形式发送和接收w3c.dom.Document Java

来自分类Dev

如何使用C处理BSD套接字中的3种方式send()和recv()

来自分类Dev

Python负载测试套接字通信

来自分类Dev

TCP 套接字通信 Java - Python

Related 相关文章

热门标签

归档