2014-05-06 37 views
0

我正在寫我的android應用程序通過TCP/IP簡單的服務器。服務器超時後接收數據包TCP/IP

我面臨一個問題,即服務器只在應用程序超時後收到消息。

我的服務器端:

  System.out.println("Connection accepted"); 

      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      capitalizedSentence = "READY"; 

      writeToUser(outToClient, "READY".getBytes()); 

      String response = readFromUser(connectionSocket); 
       // Server hangs on readFromUser(); 

      if(response.contains("IL")) 
      { 
       byte[] bytes = DatatypeConverter.parseHexBinary(foo); 
       writeToUser(outToClient, bytes); 
      } 

應用程序方面:

  if (ack.equals("READY")) { 
       ack = ""; 
       dataOutputStream.writeBytes(command); 
       dataOutputStream.flush(); 

       buf = new byte[556]; 
       dataInputStream.read(buf); 
            // app hangs on read() and gets timeout 
      } 

的問題是,服務器接收應用程序被讀取超時後,才命令。

我目前的情況是這樣的:

  1. 連接受理:申請接收「READY」
  2. 應用程序發送的命令,並試圖從服務器讀取
  3. 服務器被掛在readFromUser響應(),只有應用程序讀取超時後收到消息。

    任何想法我做錯了什麼?

更新:

代碼工作,如果我使用輸入行,而不是read(BUF)(如果我沒有理解清楚的服務器掛在讀(BUF),並在等待模式插座不即使沒有更多的數據beeing發送。)

然而,這樣的方式,我必須在每個命令後添加「\ n」,而服務器只是模擬器,應用程序與不理解「\ n」的不同設備一起工作,最後會崩潰。 有沒有什麼辦法可以使這個工作,而不使用readLine()?

更新2

public void writeToUser(DataOutputStream outToClient, byte[] bytes) throws IOException 
    { 
     outToClient.write(bytes); 
     outToClient.flush(); 
     String s = new String(bytes); 

     writeLog("Sent to client: " + s); 
    } 

    public String readFromUser(Socket socket) throws IOException, InterruptedException 
    { 
     writeLog("Reading..."); 

     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String clientSentence = inFromClient.readLine(); 

     writeLog("Received: " + clientSentence); 
     return clientSentence; 
    } 

以上readFromUser()方法作品一樣的預期。但是,這需要在客戶端應用程序發送的每個命令上添加"\n"。而我必須與之交流的真實設備並不瞭解"\n",並將該命令視爲無法識別......我僅僅爲了測試目的而編寫此服務器,並且希望它儘可能接近真實。

以前我只是想獲得它不"\n"使用inFromClient.read(cbuf);代替readLine()和服務器始終得到了掛在讀取每個命令完成,接收到的命令套接字在客戶端關閉之後。儘管我知道客戶端發送了命令並正在等待響應。

問題是如何在客戶端不使用readLine();"\n"來接收命令。

+0

你如何閱讀客戶端中的'ack'?你確定超時不是在閱讀'ack'嗎?這對我來說會更有意義。 – EJP

+0

不可以超時。請查看有關問題的更新。問題是服務器沒有收到數據。那麼它正在接收數據,但它會在讀取時掛起,並等待更多數據來臨。並且只有在套接字關閉之後,該命令才從讀取(buf)中恢復。 – Datenshi

+0

那麼readFromUser()和writeToUser()會做什麼? – EJP

回答

1

'如何在不使用readLine()的情況下接收命令;和「\ n」在客戶端「。如果您不想或不想使用「\ n」作爲命令終止符,那麼您必須使用另一種協議來標識TCP八位字節/字節流內「命令」的開始和結束。

您的'真實設備'服務器使用什麼協議來識別命令的開始和結束?如果它使用逐字節的狀態機來識別有效的命令,那麼你將不得不在你的測試服務器中複製它。

+0

這正是我所要求的。可悲的是,我對真實設備不負責任,並且正如您所說的那樣。我想有沒有簡單的方法讓我的測試服務器沒有「\ n」。我的問題不是很技術性的但你的回答是對的。謝謝。 – Datenshi

-1

爲什麼不從APPs端增加超時。或者你可以編寫一段時間在某個時間間隔內觸發服務器的線程,如果沒有響應,則顯示超時。這個問題是在應用程序方面。

+1

超時已經是15000ms,服務器在應用程序超時後立即收到命令。我知道問題出在應用程序上,但我無法理解在哪裏。 – Datenshi

0

您正在閱讀的文章,但您並未撰寫文章。所以readLine()阻塞,直到行結束符到達或對等關閉連接。

附加一個\n.

+0

嗯,我正在讀取服務器中的行,並將行寫入服務器。 (有問題的代碼僅來自服務器端)我沒有閱讀應用程序中的行,也沒有寫應用程序的行。 (這個解決方案沒有問題)問題是,我試圖使這個儘可能接近真正的設備通信,並刪除readline()只需read()。請看@馬丁詹姆斯的回答,他清楚地知道我面臨的問題。你的回答是技術性的,但你誤解了我的問題。我不太會說流利的英語和解釋,所以很抱歉。 – Datenshi

相關問題