2012-01-03 78 views
0

我有一個非常奇怪的問題,我的最後一招是在StackOverflow上詢問這個問題,所以請大家開放!閱讀Java服務器插座

這裏有兩個方案:

A.客戶:在Android手機上運行的Java客戶端。 B.服務器:運行在計算機上的Java服務器。

下面是兩個方案做:

客戶端發送服務器座標(字符串格式),每2毫秒(非常快),服務器必須讀取所有這些座標,客戶端發送。爲了實現這一點(假設服務器位於10.0.0.1並且正在監聽端口54321),服務器必須有一個套接字,通過它讀取所有傳入的信息。是的,它確實收到了所有的信息,但是,有一個問題!

現在,你有背後的故事背景,現在的問題是:

客戶端連接到服務器,一旦出現這種情況,它開始以極快的速率發送座標(以字符串格式) 。服務器確實獲得了所有消息,但除非客戶端已斷開連接,否則它不會停止讀取。我需要的是讓服務器按收到的每一條消息逐個讀取消息!

下面是我用從套接字讀取的代碼(這是針對服務器,它是在自己的線程):

while(true) { 
     try { 
      BufferedReader socketReader = 
      new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String str = socketReader.readLine(); 
      System.out.println("New Message: " + str); 
      socketReader.close(); 
     } catch (IOException e) { 
      //Client disconnected 
      System.out.println("Client disconnected."); 
      break; 
     } 
    } 

這是我從客戶端得到輸出(其中x和y是數字):

New Message: x,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,y...and so on 

而且該文本僅在客戶端斷開連接後才顯示。我希望它顯示爲消息進來

只是爲了澄清,這是所需的輸出。

New Message: x,y 
New Message: x,y 
New Message: x,y 
New Message: x,y 
... and so on 

如果這沒有任何用處的,這裏是寫插座的方法(此代碼是從客戶端)

PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); 
while(running) { 
    writer = new PrintWriter(socket.getOutputStream(), true); 
    writer.write(x+","+y); 
    writer.flush(); 
} 

所以,這一切的一切,我需要的是我的服務器讀取消息,因爲他們進來,而不是讀他們都在客戶端斷開連接後的同一時間。在C#中,我也寫了一個服務器,並且這個服務器正在讀取這個信息,但是在Java中,這並不能解決問題!

+0

是不是有什麼問題?看來IOException發生了。 – kosa 2012-01-03 02:41:02

回答

4

要調用readLine,正如它的名字所暗示的,是閱讀。您的數據不包含行。

如果可能,更改您的協議,以便每組座標由換行符和/或回車符終止。

不幸的是,我不認爲你將能夠得到這個工作。 2ms的分辨率在商用網絡硬件上是不可能的,如果你試圖強制它,所有類型的東西都會中斷。如果啓用Nagle,則當ACK遲到時,您將從Nagling獲得200毫秒的延遲。如果您禁用Nagle,則丟棄數據包將會在您的屋頂上拍攝您的延遲。

老實說,我撕了設計,並開始了通過精確的要求是什麼,以及如何你要滿足他們的思維。

你在哪裏找到可發送500個包第二的Android設備?沒有我知道的無線網絡可以做到這一點,GPS通過電線有什麼用處? (如果您還沒有將套接字緩衝區縮小到絕對最小值,使用非阻塞寫入操作以及通過在接收器中中止和刪除部分數據來處理部分寫入操作,那麼您不會在任何地方關閉滿足你的要求,你不得讓數據備份,如果有在連接帶寬瞬間下降。)

+0

+1偉大的想法(我沖洗後()的想法,但他已經想到這一點) – 2012-01-03 02:44:41

+0

哇咔咔,我要去嘗試,如果它的作品,我會拍自己的背了很多次。 :D – 2012-01-03 02:47:09

+0

好的,大衛你是對的,我在郵件中加了一個「\ r \ n」。但我也必須擺脫「socketReader.close;」這一行。還好,生病了,每秒要60包。每秒60幀就足夠好了。感謝您的所有精彩輸入,非常感謝。順便說一句,我試圖通過做socket.noTcpDelay(true)禁用Nagle;那是對的嗎?我只在客戶端的代碼上做到了,而不是在服務器上,我是否需要在兩者上都這樣做? – 2012-01-03 02:52:50

0

每次在客戶端的輸出套接字上執行flush()。消息實際上被緩存,直到你關閉套接字。

+0

是的,我有writer.flush();已經在客戶的代碼上。無論如何感謝您的答覆。還有其他建議嗎?我也會發布客戶的寫作方法。 – 2012-01-03 02:43:20