Java套接字停止从DataOutputStream读取

时间:2015-11-07 10:56:14

标签: java sockets inputstream overloading connection

我遇到套接字通信问题。 有时,当服务器仍在发送新消息时,从客户端的输入流读取将停止工作。我调试了服务器,所以我知道它仍在工作并向输出流发送消息。但在客户端,输入流的读取被阻止。我不能在客户端调试这种情况。在一切停止之前,我只看到客户端收到的消息有所不同。

一切正常时收到好消息的示例。单行发送消息(我在客户端使用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;

这是在我的socket停止从输入读取之前发生的。一个大混乱。从一开始就在一行中发送的所有内容。看起来缓冲区过载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 个答案:

答案 0 :(得分:0)

您必须在流中写一些其他内容。捕捉和忽略readUTF()不是解决方案。一旦你得到它,你永远不会再与发送者同步。

NB将if (map.grid[i][j] == rek.getName())的结果转换为String是徒劳的。它已经是一个字符串。