繁体   English   中英

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

[英]How to read bytes on receiver in socket stream (java)

我已经在服务器和客户端之间建立了套接字连接。 现在,我正在尝试将数据从客户端发送到服务器。 实际上,数据是一个字节数组,其中包含索引在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();     
}

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

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

您的程序还必须遵循TCP协议,并具有自己的缓冲和刷新机制。 当您首先使用原始字节流对Java程序进行编码时,这一层的存在并不明显。

我建议您要么构造确定性协议,例如使用标记字节(如“ 000”)来指示传输的开始,然后使用编码的有效载荷排除“ 000”,最后使用“ 000”来终止传输。 (这仍然不能很好地处理传输损失)。

另外,Google的Protocol BufferMsgpack可以帮助您完成一些中间过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM