简体   繁体   English

Java 套接字停止从 DataOutputStream 读取

[英]Java socket stop reading from DataOutputStream

I have a problem with socket communication.我有套接字通信问题。 Sometimes reading from inputstream on client side stops working while the server is still sending new messages.有时从客户端的输入流读取停止工作,而服务器仍在发送新消息。 I debugged the server so I know that is still working and sending messages to the outputstream.我调试了服务器,所以我知道它仍在工作并向输出流发送消息。 But on the client side read from inputstream is blocked.但是在客户端从输入流读取被阻止。 I can't debug this situation on client side.我无法在客户端调试这种情况。 I only see difference in received messages on client side just before everything stops.在一切停止之前,我只看到客户端收到的消息有所不同。

Example of good received message when everything works fine.一切正常时收到的良好消息示例。 Single send message in one line (I use DataInputStream.readUTF() method on client side and DataOutputStream.writeUTF(String msg) on server side. )单行发送消息(我在客户端使用 DataInputStream.readUTF() 方法,在服务器端使用 DataOutputStream.writeUTF(String msg) 。)

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;

And this is happens just before my socket stop reading from input.这发生在我的套接字停止从输入读取之前。 One big mess.一场大乱。 And everything that has been sent from the beginning in one line.从一开始就在一行中发送的所有内容。 It looks like the buffer overload Oo What happens?看起来像缓冲区过载 Oo 会发生什么?

   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

Client side客户端

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");
    }
}

Server side服务器端

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();
    }
}

You must be writing something else to the stream.您必须在流中写入其他内容。 Catching and ignoring UTFDataFormatException is no solution.捕获和忽略UTFDataFormatException不是解决方案。 Once you get it, you will never get back into sync with the sender.一旦你得到它,你将永远不会再与发件人同步。

NB Converting the result of readUTF() to a String is futile.注意将readUTF()的结果转换为 String 是徒劳的。 It already is a String.它已经是一个字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM