如何在套接字流中读取接收器上的字节数(java)

时间:2015-02-10 23:03:10

标签: java sockets byte bytearray

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

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

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

难点在于,当我从阵列发送一条线到服务器时,除了字符串之外我不知道如何阅读它。如果它是一个字符串,它会返回一些奇怪的数字,如图中所示。

enter image description here

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

发件人

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];

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

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

那么,我该怎么读呢?

更新

所以我明白我将使用不同的输入/输出流。现在我也改变了Datainput和输出流。

代码如下所示:

服务器

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();     
}

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的程序还必须符合TCP协议,它具有自己的缓冲和刷新机制。当您首次使用原始字节流编写Java程序时,此层的存在是不明显的。

我建议您构建一个确定性协议,例如使用标记字节,如&#34; 000&#34;指示传输的开始,以及排除&#34;#&#34;以及最后&#34; 000&#34;的编码有效负载。终止你的传输。 (这仍然不能很好地处理传输损失)。

或者,Google的Protocol BufferMsgpack可以提供一些中介流程。