如何确保我的服务器读取客户端编写的内容?

时间:2011-04-09 00:39:42

标签: java sockets objectoutputstream

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

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

如何确保我从客户端发送的字节数相同?

3 个答案:

答案 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();