【问题标题】:TCP problem - hangs when reading server's responseTCP 问题 - 读取服务器响应时挂起
【发布时间】:2023-04-02 12:27:01
【问题描述】:

我正在尝试为 Android 编写客户端,该客户端应该与本地网络上的 PC 服务器应用程序进行通信。服务器应用程序是我的朋友用 C# 编写的。目前有一个 iPhone 应用程序正在使用这个服务器应用程序,没有任何问题。

我有非常简单的 TCP 客户端代码:

1. Socket s = new Socket(server, port);
2. OutputStream out = s.getOutputStream(); 
3. PrintWriter output = new PrintWriter(out); 
4. output.println("ACTION=Next&VALUE=0&"); 
5. BufferedReader input = new BufferedReader(new nputStreamReader(s.getInputStream())); 
6. String st = input.readLine(); 

我浏览了很多 TCP 实现示例,它们都很相似。很像我上面的代码。当我尝试从服务器读取响应时,我的应用程序在第 6 行冻结。 它不会导致任何错误(没有异常),调试器中没有任何显示,只是一段时间后出现超时错误。在第 4 行执行我的操作后,服务器应该返回字符串。 我不明白为什么这段代码会挂起。输入不是 NULL(我已经检查过了)。我希望会引发一些异常,或者只是返回空字符串。

所以?我错过了什么?服务器应用程序正在发送的一些特殊字符是否有问题而android无法处理?我的清单是否需要任何特殊许可?

我确信我有正确的 IP 地址和正确的端口号。我可以在我的 PC 上运行的服务器应用程序上看到它。

谢谢。

【问题讨论】:

  • readLine() 是否等待换行符?服务器是否应该发送换行符?
  • 谢谢。那是问题之一。作为消息终结者服务器应用程序作者使用 序列。事实证明,问题不止一个。在第 4 行,我不得不用 & 替换所有 & 字符。但这并不是解决办法。似乎 PrintWriter 向 OutputStream 添加了一些东西,可能是 \n 字符或类似的东西。服务器不喜欢这样,我的行为被忽略了。我尝试了 PrintStream 而不是 PrintWriter,效果很好。

标签: android tcp tcpclient


【解决方案1】:

String st = input.readLine();此命令是否使程序等待直到正在读取某些内容,或者它只是直接获取缓冲区中的任何内容。我想你需要不断地检查是否有来自服务器的东西。我的意思是,你需要一个无限循环,比如 While (True){ st = input.readLine(); 这将检查是否有任何事情一直发生。如果你不使用它并且如果 String st = input.readLine();命令不会让程序等待,那么您的代码将不带任何东西结束。

【讨论】:

    【解决方案2】:

    您当然需要清单中的互联网权限。

    如果是我,我会向服务器添加检测工具,以便它可以告诉您何时有连接、该连接何时接收到数据以及何时发送回复。或者在服务器上运行 tcpdump。

    您也可以暂时尝试逐个字符而不是一次获取整行。

    试着弄清楚“对话”进展到什么程度,这样你就可以弄清楚它到底在哪里卡住了

    【讨论】:

    • 我拥有该权限集。正如我上面所说,最糟糕的是服务器忽略了我的消息并且没有发送任何响应。当我设法得到一些回应时,我能够想出休息。我将检查 tcpdump 程序。我以前从来没有做过这样的事情。如果我以前知道,那会很有帮助。谢谢。
    • 你解决了这个问题然后你必须指定问题并给出答案并回答我面临同样的问题
    • 先生,请尽快回复我,我正在等待您的宝贵回复提前谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2018-10-26
    相关资源
    最近更新 更多