我正在尝试编写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上运行的服务器应用程序上。
感谢。
答案 0 :(得分:1)
String st = input.readLine();此命令是否使程序等待直到读取某些内容,或者只是直接读取缓冲区中的内容。我猜你需要连续检查是否有来自服务器的东西。我的意思是,你需要一个无限循环,类似于
While (True){
st = input.readLine();
这将检查是否有任何事情发生。如果你不使用它,如果String st = input.readLine();命令不会使程序等待,然后你的代码将结束而不带任何东西。
答案 1 :(得分:0)
您当然需要在清单中获得互联网许可。
如果是我,我会向服务器添加检测,以便它可以告诉您何时有连接,何时该连接已接收数据,以及何时发送回复。或者在服务器上运行tcpdump。
您也可以暂时尝试按字符抓取输入字符,而不是一次抓取整行。
尝试弄清楚“对话”的进展情况,以便了解它真正陷入困境