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

问题描述

所以我写了一个程序,使用python套接字库在raspi和android手机之间通过wifi直接通信。非常简单,目前手机发送“最新消息!” pi接收它并打印它接收的内容。除了非常不可靠之外,它还能工作,并且我在消息中得到了一些额外的字节。

发送“最新消息!”时我收到
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!");