我在服务器和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];
如果我用大写字母将其更改为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();
}
正如您在我的客户端中看到的,我想一次向服务器发送一个字节,但它仍然显示奇怪的数字,如[?] [?] [?]。
答案 0 :(得分:0)
所有* Reader类仅适用于文本数据。使用二进制数据时,只需直接使用流。在您的情况下,只需使用BufferedInputStream而不是BufferedInputStreamReader。
答案 1 :(得分:0)
您的程序还必须符合TCP协议,它具有自己的缓冲和刷新机制。当您首次使用原始字节流编写Java程序时,此层的存在是不明显的。
我建议您构建一个确定性协议,例如使用标记字节,如&#34; 000&#34;指示传输的开始,以及排除&#34;#&#34;以及最后&#34; 000&#34;的编码有效负载。终止你的传输。 (这仍然不能很好地处理传输损失)。
或者,Google的Protocol Buffer或Msgpack可以提供一些中介流程。