【问题标题】:How to read bytes on receiver in socket stream (java)如何在套接字流中读取接收器上的字节(java)
【发布时间】:2015-02-10 23:03:09
【问题描述】:

我已经在服务器和 i 客户端之间建立了一个套接字连接。现在我正在尝试将数据从我的客户端发送到服务器。实际上,数据是一个字节数组,其中包含索引 14 到 27 中的数字。数组的示例如下:

{27, 14, 16, 18, 20, 22, 14, 17, 15, 17} and so on.

已将其制成字节数组,因为数据必须以字节为单位。

困难在于,当我从数组向服务器发送一行时,除了字符串之外,我不知道如何读取它。如果它是一个字符串,它会返回一些奇怪的数字,就像你在图片中看到的那样。

一些代码我是如何做到的:

发件人

for (int i = 0; i < data.length; i++) {
        writer.write(data[i]);
    }

    writer.flush();
    writer.close(); 

接收者

public void readResponse(Socket client) throws IOException{
  String userInput;
  BufferedReader stdIn = new BufferedReader(new InputStreamReader(client.getInputStream()));

  System.out.println("Response from client:");
  while ((userInput = stdIn.readLine()) != null) {
      System.out.println(userInput);

  }

}

我的字节数组是这样制作的:

private byte data[] = new byte[12];

如果我将其更改为大写字节,我可以使用我的代码读取它,但我不确定它是否以字节为单位?必须使用一些数学来计算平均值。

私有字节数据[] = 新字节[12];

那么,我该如何阅读呢?

更新:

所以我知道我将使用不同的输入/输出流。现在我也把它改成了数据输入和输出流。

代码如下:

服务器

public void readResponse(Socket client) throws IOException{

    DataInputStream input = null;

    byte data;

    try {
        input = new DataInputStream(client.getInputStream());
    }
    catch (IOException e) {
        System.out.println(e);
    }

    System.out.println("Response from client:");
    while ((data = input.readByte()) != -1)  {
        System.out.println(data);
    }

}

客户

public void sentData(Socket client) throws IOException{     

    DataOutputStream output = null;
    try {
        output = new DataOutputStream(client.getOutputStream());
    }
    catch (IOException e) {
        System.out.println(e);
    }

    for (int i = 0; i < data.length; i++) {
        output.write(data[i]);
    }

    output.flush();
    output.close();     
}

正如您在我的客户端中看到的,我想一次向服务器发送一个字节,但它仍然显示奇怪的数字,例如 [?][?][?]。

【问题讨论】:

    标签: java sockets byte bytearray


    【解决方案1】:

    所有 *Reader 类仅适用于文本数据。处理二进制数据时,只需直接使用流。在您的情况下,只需使用 BufferedInputStream 而不是 BufferedInputStreamReader。

    【讨论】:

    • 哦,是的。相同的故事。作家仅用于文本。只需将原始流用于二进制。
    • 仍然不起作用...已将其更改为 DataInputStream input = null;在服务器上,以及在客户端上的 DataOutputStream。
    • 您必须发布更新的代码。如果您要使用 Data*Streams,则应该使用 write(byte[] b, int off, int len) 和 read(byte[] b)。但是对于您的情况,一个普通的缓冲流就足够了,因为您只能读/写字节。
    • 现在更新了..如果我的数据输入/输出流也用错了,能否请您为 Bufferreader 编写代码?
    【解决方案2】:

    您的程序还必须遵守 TCP 协议,它有自己的缓冲和刷新机制。当您第一次使用原始字节流编写 Java 程序时,这一层的存在并不明显。

    我建议您构建一个确定性协议,例如使用像“000”这样的标记字节来指示传输的开始,并使用不包括“000”的编码有效负载,最后使用“000”来终止传输。 (这仍然不能很好地处理传输中的损失)。

    或者,Google 的 Protocol BufferMsgpack 可以帮助完成一些中间过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-28
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多