Java 使用tcp发送负字节

Java 使用tcp发送负字节,java,tcp,Java,Tcp,我通过TCP连接发送一个字节,当我发送一个负数(如本例中的-30)时,我得到三个字节: 客户端: PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); out.write((byte)-30); out.flush(); out.close(); 服务器端: is = new DataInputStream(clientSocket.get

我通过TCP连接发送一个字节,当我发送一个负数(如本例中的
-30
)时,我得到三个字节:

客户端:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
out.write((byte)-30);
out.flush();
out.close();
服务器端:

is = new DataInputStream(clientSocket.getInputStream());
is.readFully(bbb);
for (int i=0;i<bbb.length;i++)
    System.out.println(i+":"+bbb[i]);

但我只发送了
-30

您正在使用一个writer,您正在呼叫:

只写一个字符。要写入的字符包含在给定整数值的16个低阶位中;16个高阶位被忽略

因此,您得到了一个到
int
的转换,然后取
int
的底部16位。所以您实际上是在平台默认编码(看起来是UTF-8)中编写Unicode字符65506()。这不是你想写的,而是你正在写的


如果您只想编写二进制数据,那么根本不应该使用
编写器。只需使用
OutputStream
——如果需要,将其包装在
DataOutputStream
中,但不要使用
编写器。
Writer
类用于文本。

您正在使用一个Writer,您正在调用:

只写一个字符。要写入的字符包含在给定整数值的16个低阶位中;16个高阶位被忽略

因此,您得到了一个到
int
的转换,然后取
int
的底部16位。所以您实际上是在平台默认编码(看起来是UTF-8)中编写Unicode字符65506()。这不是你想写的,而是你正在写的


如果您只想编写二进制数据,那么根本不应该使用
编写器。只需使用
OutputStream
——如果需要,将其包装在
DataOutputStream
中,但不要使用
编写器。
Writer
类用于文本。

如果使用基本outputstreams和inputstreams,会发生什么?
PrintWriter
建议它对传递的值进行一些“格式化”。你看过文档了吗?谢谢大家,是的,我使用了基本的输出流,现在可以工作了,非常感谢!如果使用基本outputstreams和inputstreams会发生什么情况?
PrintWriter
建议它对传递的值进行一些“格式化”。你看过文档了吗?谢谢大家,是的,我使用了基本的输出流,现在可以工作了,非常感谢!谢谢,我使用了基本的输出流,现在可以使用了!乔恩!谢谢,我使用了基本的输出流,现在可以使用了!乔恩!
0:-17
1:-65
2:-94