Java套接字停止从DataOutputStream读取

Java套接字停止从DataOutputStream读取,java,sockets,inputstream,overloading,connection,Java,Sockets,Inputstream,Overloading,Connection,我的套接字通信有问题。 有时,当服务器仍在发送新消息时,从客户端的inputstream读取停止工作。我调试了服务器,以便知道它仍在工作,并向outputstream发送消息。但是在客户端,从inputstream读取被阻止。我无法在客户端调试这种情况。在一切停止之前,我只看到客户端接收到的消息的差异 当一切正常时收到良好消息的示例。一行发送一条消息(我在客户端使用DataInputStream.readUTF()方法,在服务器端使用DataOutputStream.writeUTF(Strin

我的套接字通信有问题。 有时,当服务器仍在发送新消息时,从客户端的inputstream读取停止工作。我调试了服务器,以便知道它仍在工作,并向outputstream发送消息。但是在客户端,从inputstream读取被阻止。我无法在客户端调试这种情况。在一切停止之前,我只看到客户端接收到的消息的差异

当一切正常时收到良好消息的示例。一行发送一条消息(我在客户端使用DataInputStream.readUTF()方法,在服务器端使用DataOutputStream.writeUTF(String msg))

这是在我的套接字停止读取输入之前发生的。一团乱。所有从一开始就在一行中发送的内容。看起来像是缓冲区过载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();
    }
}

您一定在向流中写入其他内容。捕获并忽略
UTFDataFormatException
不是解决方案。一旦你得到它,你将永远无法与发送者恢复同步


注意:将
readUTF()
的结果转换为字符串是徒劳的。它已经是一个字符串了

您需要显示您的代码。即使我从循环中删除所有链接,并只保留字符串read=in.readUTF();此工作表发生。UTFDataFormatException永远不会出现,因为我使用UTF8发送消息。这是readUTF()方法的默认try-catch块。我还知道将字符串转换为字符串没有意义。但这不是问题。编写冗余代码总是一个问题,而你完全忽略了我的第一句话。另一种可能是,您正在从流中读取其他内容。很难相信IDE会为
UTFDataFormatException
提供一个默认的
catch
块,而不是
eofeexception
,如果这是您含糊其辞地宣称的话。在本例中,冗余代码不是问题,请忘记它。您是对的,readUtf()的默认catch块是EOFEException。但我没有收到来自try-catch块的任何错误。我在oracle socket实现文档中找到了解决问题的方法。我用InputStreamReader替换了DataInputStream。我不完全确定,但我认为问题在于DataInputStream的缓冲区大小。不是,因为
DataInputStream
没有缓冲区。除非您还将
DataOutputStream
更改为
BufferedWriter
,否则您的“解决方案”不会起作用,您没有说明这一点。
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();
    }
}