[英]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 Buffer或Msgpack可以帮助您完成一些中间过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.