【问题标题】:readLine of socket input stream causes hang in socket套接字输入流的 readLine 导致套接字挂起
【发布时间】:2017-07-26 16:38:29
【问题描述】:

您好,我有一个向设备发送文本的应用程序,设备会在显示屏上显示它。为了传输数据,我在 AsyncTask 类中使用套接字

            try {
                Socket socket = new Socket(DISPLAY_IP, DISPLAY_PORT);
                OutputStream out = socket.getOutputStream();
                PrintWriter output = new PrintWriter(out);
                output.println(params[0]);
                output.flush();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

问题是发送数据后我无法从套接字读取响应。当我从套接字和读取行获取输入流时,我什么也没有得到,并且设备在我关闭应用程序之前没有显示我发送的数据,所以我认为套接字在我这样做时阻塞了

           try {
                Socket socket = new Socket(DISPLAY_IP, DISPLAY_PORT);
                OutputStream out = socket.getOutputStream();
                PrintWriter output = new PrintWriter(out);
                output.println(params[0]);
                output.flush();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String response = bufferedReader.readLine();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

如何从套接字发送数据和读取响应?

【问题讨论】:

  • 不太确定问题出在哪里,但 readLine() supposed 会挂起 - 它会一直挂起,直到另一端实际发送了一行(或直到连接超时或损坏)。我建议尝试使用 netcat 发送相同的消息并查看是否收到响应 - 这可能是服务器的问题,而不是客户端的问题。
  • 服务器在收到我刚刚发送的数据后向我发送OK,我该怎么办? @SirGregg

标签: java android sockets


【解决方案1】:

您正在尝试与两个(客户端)Sockets 通信。对于通信,您必须在一侧实现(客户端)java.net.Socket,在另一侧实现 java.net.ServerSocket。

您可以进一步阅读here。

【讨论】:

  • 让我试试@PeterMmm
【解决方案2】:

你想达到什么目的? 使用 InputStream 时,它将获取来自另一端的数据,而不是您刚刚发送的数据。 正如 SirGregg 所说,readLine 将挂起,直到收到整条线路。

【讨论】:

  • 我需要知道服务器收到了我的数据,所以它给我发回了OK,我需要阅读它
  • @Amir_P 可能服务器没有发送\n,所以行没有结束。 readLine 将等待行尾字符
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多