2010-11-14 68 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();命令不會讓程序等待,那麼你的代碼就會結束而不需要任何東西。