我正在从套接字客户端写一个字节数组:
byte[] arr = { 49, 49, 49, 49, 49};
InetAddress address = InetAddress.getByName(host);
connection = new Socket(address, port);
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
在接收端,我在服务器上:
byte[] msgType = new byte[5];
in = new BufferedInputStream(connection.getInputStream());
int bytesRead = in.read(msgType, 0, 5);
System.out.println("msg rcvd: " + msgType.toString());
在输出中我得到奇怪的字符串:
server: waiting for connection
server: connection received from localhost
server: Connection Successful
bytes read: 5
msg rcvd: ��w
如何确保我从客户端发送的字节数相同?
答案 0 :(得分:1)
我不确定究竟是什么打印出来,但我可以告诉你,msgType.toString()
不会打印字节数组的内容。
Here是我找到的一个方法的链接,它将以更有意义的方式打印出字节数组。
答案 1 :(得分:1)
你获得相同的字节,这只是你如何解释它们的问题。如果您希望将字节视为String
,请改用:
System.out.println("msg rcvd: " + new String(msgType, "UTF-8"));
请注意,您正在处理的字节具有正确的编码(我在这里假设为UTF-8)。由于您已经ObjectOutputStream
,因此您可以在服务器端使用writeUTF()
,在客户端使用ObjectInputStream.readUTF()
。
答案 2 :(得分:0)
如果您在一侧使用ObjectOutputStream
,则必须在另一侧使用ObjectInputStream
。
在您的情况下,一个简单的OutputStream(可能是缓冲的)和.write()
以及.read()
都可以。
但是对于打印,请不要使用byte[].toString()
,如果您想要格式化输出,请使用Arrays.toString()
。
编辑:我只是看到你甚至没有在发送端编写你的阵列。所以你实际上只是在阅读ObjectOutputStream标题。
来自评论:
我正在处理服务器端,我被告知我将发送一个字节数组。怎么样 接收并打印该字节数组?在这种情况下,字节数组是文本/字符串的字节
这听起来像服务器发送的东西就像在某些编码中编码的字符串,如ASCII,UTF-8或ISO-8859-1。如果是这样,在接收端你可以使用这样的东西:
String encoding = "UTF-8";
BufferedReader in =
new BufferedReader(new InputStreamReader(connection.getInputStream(),
encoding));
String line;
while((line = in.readLine()) != null) {
System.out.println(line);
}
当然,请确保编码与发送方实际使用的编码相同。
相应的发送代码可能是这样的:
String encoding = "UTF-8";
Writer w =
new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),
encoding));
w.write("Hello World!\n");
w.write("And another line.\n");
w.flush();