2010-11-14 67 views
1

我正在尝试为Android编写客户端,它应该与本地网络上的PC服务器应用程序进行通信。服务器应用程序由我的朋友在C#中编写。目前有一款iPhone应用程序正在使用此服务器应用程序,没有任何问题。TCP问题 - 在读取服务器响应时挂起

我有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

readLine()是否等待换行符?服务器应该发送换行符吗? – Slartibartfast 2010-11-14 06:56:27

+0

谢谢。这是问题之一。作为一个消息终结者服务器应用程序作者使用序列。结果出现了更多的问题。在第4行中,我必须用&替换所有的&字符,但那不是解决方案。看来,PrintWriter增加了一些OutputStream,可能\ n字符或类似的东西。服务器不喜欢,我的行为被忽略。我尝试了PrintStream而不是PrintWriter,并且完美地工作。 – bobetko 2010-11-15 05:46:27

回答

0

您当然需要清单中的互联网许可。

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

您也可以暂时尝试一次抓取输入字符而不是整行。

揣摩多远“对话”正在取得进展,所以你可以揣摩出它真正卡住

+0

我有这个权限集。正如我上面所说,最糟糕的部分是服务器忽略了我的信息,并没有发送任何回应。当我设法得到回应时,我能够休息一下。我会看看tcpdump程序。我以前从来没有做过这样的事情。如果我以前知道这将有所帮助。谢谢。 – bobetko 2010-11-15 05:50:49

+0

你解决了这个问题,那么你必须指定的问题,并给予resion和回答,请我面临同样的问题 – 2015-03-03 10:31:28

+0

先生请尽快恢复我我等待你的宝贵回复,提前致谢 – 2015-03-03 10:54:51

1

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

相关问题