我正在创建一个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
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]
谢谢
这个问题的问题是有符号变量与无符号变量的问题。当你在计算机内存中有一个数字时,它是由一串位来表示的,每一个都是0或1。字节一般是8位,短路是16等。在一个无符号的数字中,8位将使您从正0到255,但不是负数。
这就是有符号的数字的来源。在一个有符号的数字中,第一位告诉你后面的位是表示负值还是正值。所以现在你可以用8位来表示-128到+127。(注意,正范围减半,从255到127,因为你“牺牲”了一半的范围给负数)。
那么现在,如果您将签名转换为未签名,会发生什么呢?取决于你怎么做,事情可能会出错。在上面的问题中,代码char c=(char)b;
正在将带符号的字节转换为无符号的字符。正确的方法是在将字节转换为char之前“使其不带符号”。您可以这样做:char c=(char)(b&0xff);
有关强制转换字节的更多信息,请参阅此处。
我正在创建一个java客户端程序,它向服务器发送一个命令,服务器会发回一个确认和一个响应字符串。 响应以这种方式发回 客户- 服务器- 服务器- 当我尝试读取输入时,我只能读取一个输入流的确认消息 我的客户端程序能够以某种方式读取消息(hacky方法)。要读取输入,我必须使用Bufferedreader读取ack msg。 此缓冲读取器只能读取ack_msg不能读取以下msg 需要DataInpu
但是我这里有一些问题,有人能检查一下我的代码吗: 现在我想要接收字节到字节数组中&然后把它转换成int数组(但是数据应该在int数组中)........
我正在尝试通过 tcp 连接远程执行程序,我想在客户端之间实时共享标准输出和标准输出 我有以下没有错误处理的测试服务器:p我知道,目前我无法执行带有参数的程序,但这很容易处理:) 你看,我尝试与 c.Write() 共享标准输出,但这不起作用。 我认为cmd.Stdin的另一个问题将与Stdout的问题相同。此时我没有实现任何标准函数。 有人能给我一个关于这个函数的提示或示例代码吗?
从urlConnection获得的InputStream向ByteArrayOutputStreet写入数据的处理。getInputStream()花费的时间超过1分钟。 代码片段 一些观察结果是: while循环单独执行超过一分钟,并且迭代了大约2650次 HttpURLConnection响应代码为200,因此整个内容在InputStream中可用 文件的内容长度为7631029(字节)。 我
谢谢,罗伯
我有一个TCP套接字客户端(使用Socket类),它连接到一个简单的TCP套接字服务器(仅用于测试)我有以下代码段: 我还有一个检查连接状态并尝试重新连接的过程...在尝试重新连接到一个新的套接字并读取数据后,我在这一行收到一个消息错误:byteRead=asocket.receive(dataByte)‘number of bytes“一个现有的连接被远程主机强制关闭了” 我已经执行了一些搜索在