2015-11-07 57 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