2015-11-07 56 views
-1

我有一個套接字通信問題。 有時在服務器仍在發送新消息時,從客戶端的輸入流中讀取停止工作。我調試了服務器,所以我知道它仍在工作並將消息發送到輸出流。但是在客戶端,從輸入流讀取被阻止。我無法在客戶端調試這種情況。在所有事情停止之前,我只能看到客戶端收到的消息有所不同。從DataOutputStream中讀取Java套接字停止

當一切正常工作正常收到消息的示例。在一條線(我用DataInputStream.readUTF()在服務器端客戶端和DataOutputStream.writeUTF(絃樂味精)方法。)單發送消息

ADD;MB57,18-9,5,dd,10,10; 
UP;MB15;20;14;20;13;1.0; 
ADD;MB37,18-9,5,xx,10,10; 
UP;MB13;20;14;20;13;1.0; 
ADD;MB47,18-9,5,ww,10,10; 
UP;MB13;20;14;20;13;1.0; 

而這發生之前我的插座停止從輸入讀數。一個大混亂。以及從一開始就發送的所有內容。它看起來像緩衝區過載O.o會發生什麼?

11-07 11:36:41.978: I/System.out(17980): 11;8;10;8;0.1;��UPPOS;MB8;16;8;16;7;1.0;��PATH;MB8��UPPOS;MB20;14;9;14;10;1.0;�� ADDMOB;MB20,14-10,6,mummy,50,50;�� PATH;MB20��UPPOS;MB50;12;8;12;7;1.0;�� PATH;MB50��UPPOS;MB13;15;11;14;11;1.0;�� PATH;MB19��PATH;MB8��UPPOS;MB20;14;10;13;10;1.0;�� PATH;MB20��UPPOS;MB50;12;7;12;6;1.0;�� PATH;MB50��UPPOS;MB13;14;11;14;10;1.0;��UPPOS;MB19;13;9;14;9;1.0;�� PATH;MB19��PATH;MB8��UPPOS;MB20;13;10;13;9;1.0;��ADDMOB;MB20,13-9,6,mummy,50,50;�� PATH;MB20��UPPOS;MB50;12;6;12;7;1.0;�� PATH;MB50��UPPOS;MB13;14;10;15;9;1.0;��!ADDMOB;MB13,15-9,5,chicken,10,10;�� PATH;MB13��UPPOS;MB19;14;9;14;10;1.0;��!ADDMOB;MB19,14-10,1,goblin,37,50;�� PATH;MB19��UPPOS;NP12;10;8;9;8;0.1;��UPPOS;MB8;16;7;17;7;1.0;��PATH;MB8��UPPOS;MB20;13;9;12;9;1.0;�� PATH;MB20��UPPOS;MB50;12;7;11;7;1.0;�� PATH;MB50��UPPOS;MB13;15;9;14;9;1.0;�� PATH;MB13��UPPOS;MB19;14;10;13;9;1.0;�� ADDMOB;MB19,13-9,1,goblin,37,50;�� PATH;MB19��UPPOS;MB8;17;7;16;7;1.0;��PATH;MB8��UPPOS;MB20;12;9;12;8;1.0;��UPPOS;MB50;11;7;12;7;1.0;�� PATH;MB50��UPPOS;MB13;14;9;14;10;1.0;��"ADDMOB;MB13,14-10,5,chicken,10,10;�� PATH;MB13�� PATH;MB19��UPPOS;MB8;16;7;16;8;1.0;��PATH;MB8�� PATH;MB20�� PATH;MB50��UPPOS;MB13;14;10;15;10;1.0;�� PATH;MB13��UPPOS;MB19;13;9;14;9;1.0;�� PATH;MB19��UPPOS;NP12;9;8;9;9;0.1;��UPPOS;MB8;16;8;16;7;1.0;��PATH;MB8��UPPOS;MB20;12;8;12;9;1.0;�� PATH;MB20��UPPOS;MB50;12;7;12;6;1.0;�� PATH;MB50��UPPOS;MB13;15;10;14;10;1.0;��UPPOS;MB19;14;9;13;9;1.0;�� PATH;MB19��PATH;MB8��UPPOS;MB20;12;9;12;8;1.0;�� PATH;MB50��UPPOS;MB13;14;10;14;9;1.0;��!ADDMOB;MB13,14-9,5,chicken,10,10;�� PATH;MB13�� PATH;MB19��UPPOS;MB8;16;7;16;6;1.0;��PATH;MB8��UPPOS;MB20;12;8;12;7;1.0;�� PATH;MB20�� PATH;MB50��UPPOS;MB13;14;9;14;10;1.0;��"ADDMOB;MB13,14-10,5,chicken,10,10;�� PATH;MB13��UPPOS;MB19;13;9;13;10;1.0;��!ADDMOB;MB19,13-10,1,goblin,37,50;�� PATH;MB19��UPPOS;NP12;9;9;9;8;0.1;��PATH;MB8�� PATH;MB20��UPPOS;MB50;12;6;11;6;1.0;�� PATH;MB50��UPPOS;MB13;14;10;14;9;1.0;��!ADDMOB;MB13,14-9,5,chicken,10,10;�� PATH;MB13��UPPOS;MB19;13;10;13;9;1.0;�� ADDMOB;MB19,13-9,1,goblin,37,50;�� PATH;MB19��UPPOS;MB8;16;6;16;7;1.0;��PATH;MB8�� PATH;MB20��UPPOS;MB50;11;6;12;6;1.0;�� PATH;MB50��UPPOS;MB13;14;9;15;9;1.0;�� PATH;MB13�� PATH;MB19��PATH;MB8��UPPOS;MB20;12;7;12;8;1.0;�� PATH;MB20�� PATH;MB50��UPPOS;MB13;15;9;14;9;1.0;�� PATH;MB13��UPPOS;MB19;13;9;13;10;1.0;��!ADDMOB;MB19,13-10,1,goblin,37,50;�� PATH;MB19��UPPOS;NP12;9;8;10;8;0.1;��UPPOS;MB8;16;7;16;8;1.0;��PATH;MB8��UPPOS;MB20;12;8;12;7;1.0;�� PATH;MB20�� PATH;MB50��UPPOS;MB13;14;9;15;9;1.0;�� PATH;MB13��UPPOS;MB19;13;10;13;11;1.0;�� PATH;MB19��UPPOS;MB8;16;8;16;9;1.0;��PATH;MB8��UPPOS;MB20;12;7;11;7;1.0;�� PATH;MB20��UPPOS;MB13;15;9;14;9;1.0;�� PATH;MB50�� PATH;MB13��UPPOS;MB19;13;11;13;10;1.0;��UPPOS;MB20;11;7;12;7;1.0;�� PATH;MB20��UPPOS;MB8;16;9;16;8;1.0;�� PATH;MB50��UPPOS;MB13;14;9;15;9;1.0;�� PATH;MB13��UPPOS;MB19;13;10;14;10;1.0;��UPPOS;NP12;10;8;11;8;0.1;�� PATH;MB20��UPPOS;MB8;16;8;16;7;1.0;��PATH;MB8�� PATH;MB50��UPPOS;MB13;15;9;14;9;1.0;�� PATH;MB13��UPPOS;MB19;14;10;15;9;1.0;�� ADDMOB;MB19,15-9,1,goblin,37,50;�� PATH;MB19��UPPOS;MB20;12;7;11;7;1.0;�� PATH;MB20��UPPOS;MB8;16;7;16;6;1.0;��PATH;MB8��UPPOS;MB50;12;6;12;7;1.0;�� PATH;MB50��UPPOS;MB13;14;9;13;9;1.0;�� PATH;MB13��UPPOS;MB19;15;9;14;9;1.0;�� PATH;MB19�� PATH;MB20��UPPOS;MB8;16;6;16;7;1.0;��PATH;MB8��UPPOS;MB50;12;7;12;8;1.0;�� PATH;MB50�� PATH;MB13��UPPOS;MB19;14;9;14;10;1.0;��!ADDMOB;MB19,14-10,1,goblin,37,50;�� PATH;MB19��UPPOS;MB20;11;7;12;7;1.0;�� PATH;MB20��UPPOS;MB8;16;7;16;8;1.0;��PATH;MB8��UPPOS;MB50;12;8;12;9;1.0;�� PATH;MB50��UPPOS;MB13;13;9;14;9;1.0;�� PATH;MB13��UPPOS;MB19;14;10;15;10;1.0;�� PATH;MB19��UPPOS;MB20;12;7;11;7;1.0;�� PATH;MB20��UPPOS;MB50;12;9;12;8;1.0;�� PATH;MB50��UPPOS;MB8;16;8;16;7;1.0;��PATH;MB8��UPPOS;MB13;14;9;13;9;1.0;�� PATH;MB13��UPPOS;MB19;15;10;15;9;1.0;�� ADDMOB;MB19,15-9,1,goblin,37,50;��UPPOS;NP12;11;8;10;8;0.1;��UPPOS;MB20;11;7;12;7;1.0;��UPPOS;MB8;16;7;16;6;1.0;��PATH;MB8�� PATH;MB13��UPPOS;MB50;12;8;11;8;1.0 

客戶端

private DataOutputStream out; 
private Socket client; 
private DataInputStream in; 
private Thread inputListener; 
public void createConnection(){ 
    try { 
     client = new Socket(serverName, port); 
     setOut(new DataOutputStream(client.getOutputStream())); 
     in = new DataInputStream(client.getInputStream()); 
     inputListener=new Thread(){ 
      public void run(){ 
       try { 
        synchronized(in){ 
         while(client!=null){ 
          try{ 
           String read = new String(in.readUTF()); 
           /** do somethink with input msg */ 
          } catch (java.io.UTFDataFormatException e1) { 
           e1.printStackTrace(); 
          } 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally{ 
        reconnect(); 
       } 
      } 
     }; 
     inputListener.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void reconnect() { 
    try { 
     client.close(); 
     client=null; 
     inputListener.interrupt(); 
     setOut(null); 
     in.close(); 
     in=null; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally{ 
     System.out.println("RECONECT METHOD IN SOCKET"); 
    } 
} 

服務器端

private DataOutputStream out; 
private Socket client; 
public Client(Socket client) { 
    try { 
     setOut(new DataOutputStream(client.getOutputStream())); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
public void sendMessage(String string) { 
    try { 
     getOut().writeUTF(string); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     disconected(); 
    } 
} 
+1

你需要顯示你的代碼。 – Kayaman

+0

即使我放棄從循環中的所有思想,只留下String read = in.readUTF();這張紙發生。 – radekpakula

回答

0

你必須寫別的東西流。捕捉並忽略UTFDataFormatException是無法解決的。一旦你得到它,你永遠不會回到與發件人同步。

NB將readUTF()的結果轉換爲字符串是徒勞的。它已經是一個字符串。

+0

UTFDataFormatException永遠不會出現,因爲我用UTF8發送消息。這是方法readUTF()的默認try catch塊。我也知道將字符串轉換爲字符串沒有意義。但這不是問題。 – radekpakula

+1

編寫冗餘代碼總是一個問題,你完全忽略了我的第一句話。另一種可能是你正在閱讀流中的其他內容。很難相信IDE會給你一個'UTFDataFormatException'的默認'catch'塊,但不會出現'EOFException',如果這是你所晦澀的聲稱。 – EJP

+0

冗餘代碼在這個例子中不是一個問題,並忘記它。 你說得對,readUtf()的默認catch塊是EOFException。但是我從try catch塊沒有收到任何錯誤。我發現解決方案爲我的問題在oracle文檔的套接字實現https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html我替換DataInputStream for InputStreamReader 我不完全確定,但我認爲,問題是DataInputStream的緩衝區大小 – radekpakula