繁体   English   中英

Java 套接字停止从 DataOutputStream 读取

[英]Java socket stop reading from DataOutputStream

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

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

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

客户端

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()的结果转换为 String 是徒劳的。 它已经是一个字符串。

暂无
暂无

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

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