当前位置: 首页 > 知识库问答 >
问题:

TCP/IP客户端错误读取输入流字节数组

钱星华
2023-03-14

我正在创建一个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]

谢谢

共有1个答案

翟黎明
2023-03-14

这个问题的问题是有符号变量与无符号变量的问题。当你在计算机内存中有一个数字时,它是由一串位来表示的,每一个都是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“一个现有的连接被远程主机强制关闭了” 我已经执行了一些搜索在