在套接字传输中接收额外的字节

Receiving extra bytes in socket transmission

所以我编写了一个程序,使用 python 套接字库在 raspi 和 android phone 之间通过 wifi 直接通信。超级简单 rn,目前 phone 发送“Whats up!”然后 pi 接收它并打印它接收到的内容。它工作正常,但它非常不可靠,而且我在消息中收到一些奇怪的额外字节。

发送“Whats up!”时我收到
b’\xac\xed\x00\x05t\x00\tWhats up!’
b’\xac\xed\x00\x05’

我假设第二个结果是由于丢失了数据包,但我不确定消息开头的所有内容是什么。当我将消息更改为“怎么了!测试 1!!”我得到
b’\xac\xed\x00\x05t\x00\x12Whats up! Test 1!!’(注意现在添加了 \x12

谁能给我解释一下这是什么?它是套接字协议的一部分吗?我如何在我的程序中考虑它?

供参考,我的 pi 上的程序 运行 如下所示:

import socket;


server = socket.socket();
host = "192.168.4.1";
port = 4444;

server.bind((host,port));

server.listen();

client, addr = server.accept();
print (str(client.recv(2056)));

client.close();

这也是我的 android 客户端代码,以防相关

    public void runClient() throws IOException {
        socket = new Socket();
        socket.setReuseAddress(true);
        tcpSocketManager.addTextToScreen("Starting Client Socket " + groupOwnerAddress + " " + port);
        socket.connect((new InetSocketAddress(groupOwnerAddress, port)), 1000);
        OutputStream os = socket.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(new String("Whats up!"));

        oos.close();
        os.close();
        socket.close();
    }

您需要使用 OutputStreamWriter 而不是 ObjectOutputStream。后者用于写入 Java 序列化对象。

我写Java已经快两年了,但我认为这是正确的。

OutputStreamWriter writer = new OutputStreamWriter(os);
writer.write("What's up!");