在套接字传输中接收额外的字节
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!");
所以我编写了一个程序,使用 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!");