【发布时间】:2016-01-20 11:56:19
【问题描述】:
我正在创建一个 Java 客户端程序,它向服务器发送命令,服务器发回确认和响应字符串。
以这种方式发回响应
client -> server : cmd_string server -> client : ack_msg(06) server -> client : response_msg
客户端代码
public static void readStream(InputStream in) {
byte[] messageByte = new byte[20];// assuming mug size -need to
// know eact msg size ?
boolean end = false;
String dataString = "";
int bytesRead = 0;
try {
DataInputStream in1 = new DataInputStream(in);
// while ctr==2 todo 2 streams
int ctr = 0;
while (ctr < 2) {//counter 2 if ACK if NAK ctr=1 todo
bytesRead = in1.read(messageByte);
if (bytesRead > -1) {
ctr++;
}
dataString += new String(messageByte, 0, bytesRead);
System.out.println("\ninput byte arr "+ctr);
for (byte b : messageByte) {
char c=(char)b;
System.out.print(" "+b);
}
}
System.out.println("MESSAGE: " + dataString + "\n bytesread " + bytesRead + " msg length "
+ dataString.length() + "\n");
char[] chars = dataString.toCharArray();
ArrayList<String> hex=new ArrayList<>();
// int[] msg ;
for (int i = 0; i < chars.length; i++) {
int val = (int) chars[i];
System.out.print(" " + val);
hex.add(String.format("%04x", val));
}
System.out.println("\n"+hex);
} catch (Exception e) {
e.printStackTrace();
}
// ===
}
输出
client Socket created ..
response:
input byte arr 1
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
input byte arr 2
2 -77 67 79 -77 48 -77 3 -116 0 0 0 0 0 0 0 0 0 0 0
MESSAGE: ##³CO³0³##
(where # is some not supported special character )
bytesread 9 msg length 10
dec: 6 2 179 67 79 179 48 179 3 338
hex: [0006, 0002, 00b3, 0043, 004f, 00b3, 0030, 00b3, 0003, 0152]
bytes: 2 -77 67 79 -77 48 -77 3 -116 0 0 0 0 0 0 0 0 0 0 0 (bytes recieved in 2nd packet)
connection closed
问题:我读取的最后一个值不正确,我使用wireshark验证服务器已将响应发送回为06 02 b3 43 4f b3 30 b3 03 8c
我如何正确读取最后一个值。阅读流有问题吗?
编辑
响应的其余部分读取正确,但最后一个字符应为 8c 但读取为 0152Hex
来自服务器的响应:06 02 b3 43 4f b3 30 b3 03 8c
按程序读取:[0006, 0002, 00b3, 0043, 004f, 00b3, 0030, 00b3, 0003, 0152]
读取最后一个字符的问题
编辑 2
以 2 个数据包/流的形式收到响应
packet 1 byte arr : 6 (ACK)
packet 2 byte arr: 2 -77 67 79 -77 48 -77 3 -116 (response)
客户端读取的完整响应
dec: 6 2 179 67 79 179 48 179 3 338
hex: [0006, 0002, 00b3, 0043, 004f, 00b3, 0030, 00b3, 0003, 0152]
谢谢
【问题讨论】:
-
您是否尝试过直接检查 bytesRead,而不转换为 String 并返回?也许它只是一个编码问题。
-
@HenkDeBoer 我也发布了字节图。
-
在 8 位算术中,十六进制 8C 和十进制 -116 是相同的值。因此,您读取了正确的值,只是将其转换为错误的表示形式。
-
@DavidSchwartz 你能解释一下我应该如何转换吗?我对这些概念不熟悉。
-
@RachitaNanda 目前尚不清楚您要做什么。此外,您的代码无法产生您显示的输出。所以我很难确切地说出问题是什么。但作为开始,请停止转换为有符号类型。