0

我正在从套接字客户端编写一个字节数组:

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

如何确保获得与从客户端发送的相同字节?

4

3 回答 3

1

我不确定到底要打印什么,但我可以告诉你这msgType.toString()不会打印字节数组的内容。

是我发现的一个链接,该链接将以更有意义的方式打印出字节数组。

于 2011-04-09T01:03:08.280 回答
1

你得到相同的字节,这只是你如何解释它们的问题。如果您想查看字节,请String改为使用:

System.out.println("msg rcvd: " + new String(msgType, "UTF-8"));

请注意,您正在处理的字节具有正确的编码(我在这里假设为 UTF-8)。既然你已经ObjectOutputStream这样做了,你可以只writeUTF()在服务器端和ObjectInputStream.readUTF()客户端使用它。

于 2011-04-09T01:18:40.823 回答
0

如果您ObjectOutputStream在一侧使用 an,则必须ObjectInputStream在另一侧使用 an。

在您的情况下,一个简单的 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();
于 2011-04-09T01:17:08.413 回答