使用 ASCII 协议从 Java 套接字获取前面带有 NAK 的非打印字符

Getting Non-Printing Characters, Preceded by NAK, from Java Socket using ASCII protocol

这很奇怪。我有一个 Runnable 负责向套接字发送消息并检索响应。当我创建一个测试 class 时,它只是创建一个 Runnable 的实例,发送消息并获取响应,我得到了预期的输出(一个 CSV 字符串)。但是,当我 运行 exact 与我正在构建的应用程序的一部分相同的代码时,响应是一系列不可打印的字符,以“\u0015”开头(NAK).1 使用套接字的协议在任何时候都不会发出 NAK。 (它应该发出 "FAIL_{reason}".

我得到 NAK 的事实是否与 Socket 本身的 Java 实现有任何关系? (我试图获取调用的堆栈跟踪,但我得到的只是调用 run() 方法的点,没有从其中调用的方法。据我所知,在从套接字的流读取和应用程序通过包装器请求响应之间没有任何意义, NAK 的字符是否被添加到响应之前。)

编辑: 与一位知识渊博的同事谈过意外响应后,他似乎觉得制作套接字服务器的应用程序正在用这些字节进行响应。然而,它的代码似乎没有明确要求它这样做,因为它应该以人类可读的文本进行响应。


  1. 具体我得到的字节是0x15 0x03 0x01 0x00 0x02 0x02,对应的是NAK ETX NUL STX STX,是乱码。

经过这几天的问题调试(包括用WireShark查看数据包,打印方法参数),我终于找到了问题的根源。

我错误地将安全 WebSocket 连接的连接详细信息传递给 TCP/IP 套接字创建和交互代码。它从未连接到提供 TCP/IP 套接字服务器的本地应用程序。