【问题标题】:Conversion of unreadable string from TCP IP port in javajava中TCP IP端口不可读字符串的转换
【发布时间】:2020-07-25 17:39:33
【问题描述】:

我正在尝试使用 Java Socket Programming ServerSocket 从系统的 TCP IP 端口读取连续数据,但我得到了不可读的字符串数据,如下图所示:

我正在使用以下代码从 TCP IP 端口读取数据:

 ServerSocket server_socket;
            BufferedReader input;
            try {
                server_socket = new ServerSocket(6666);
                LOGGER.info("Server waiting for client on port "
                        + server_socket.getLocalPort());
                System.out.println("Server waiting for client on port "
                        + server_socket.getLocalPort());
                while (true) {
                    Socket socket = server_socket.accept();

                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    try {
                        while (true) {
                            String message = input.readLine();
                            if (message == null) {
                                break;
                            }

                        }
                    } catch (Exception e) {
                        socket.close();
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

所以请让我知道上图中的数据是什么类型的,我应该做什么转换?

提前致谢。

【问题讨论】:

  • 套接字的另一端是什么应用程序?它使用的协议是否已知?您能否包含接收到的数据的十六进制表示来代替或补充文本?
  • 对不起,我不知道其他终端协议,但它是硬件 RFID 读取器设备,在配置的服务器上发送数据
  • 在这种情况下,除非您可以提供任何其他详细信息,否则这很可能会变成逆向工程问题。为此,请包含接收数据的十六进制表示,因为熟悉协议的人很可能会发现该表示中的任何幻数或模式
  • 和@nanofarad 你能告诉我它是什么样的数据格式吗?编码形式是什么?
  • 您是否有任何文件,包括设备的制造商或型号/序列号?

标签: java serversocket


【解决方案1】:

一个缺陷:

InputStreamReader 负责将二进制数据(输入流)转换为阅读器((Unicode)文本)。为此,您可以&应该指定一个文本编码,一个字符集。您正在使用默认的平台编码。

input = new BufferedReader(
            new InputStreamReader(socket.getInputStream(), StandardCharsets.ISO_8859_1));

您现在可以通过 telnet 或其他终端工具自行访问此服务器应用程序。甚至是http://localhost:6666/ (telnet://localhost:6666/?) 的浏览器。

您所看到的确实看起来像非文本二进制数据 - 如果默认编码不是中文等。

此外,代码将通过来自处理来自acceptsocket 的线程池中的新线程来改进。

应注意发送(您不输出)然后接收的标题行。

【讨论】:

  • "6666 端口用于 TCP/UDP" 你这是什么意思? UDP和TCP是两个完全不同的协议
  • @Joni 你是对的;我知道 TCP 和 UDP 是完全不同的东西,但是记住的端口号也不正确。谢谢,已删除
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多