-1

我正在使用一个线程和一个真正的循环来监听来自我的服务器的消息。由于某些奇怪的原因,一些消息会丢失。(我从我的服务器登录,所以我 100% 确定消息已发送,因此问题必须在客户端)。这似乎发生在服务器向客户端快速发送消息时。

我使用以下代码来收听新消息(在我的客户端上):

        Socket socket;
        try {
            socket = new Socket(InetAddress.getByName("url.com"), 8080);
            is = new DataInputStream(socket.getInputStream());
            os = new DataOutputStream(socket.getOutputStream()); 
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);


            JOptionPane.showMessageDialog(rootPane,
                "Could not establish network connection to the server."
                + " \nPlease check your internet connection and restart the application.",
                "Unable to connect",
                JOptionPane.INFORMATION_MESSAGE);

            WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
            Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
            setVisible(false);
            dispose();
            System.exit(0); 
        }

        // Starta thread to listen for messages from the server
        new ListenFromServer().start();




  /*
     * Thread class to listen for message from the server
     */
    class ListenFromServer extends Thread {

        public void run() {
            while (true) {

                try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(is));

                    String tmpMsg = in.readLine().replaceAll("\\r\\n|\\r|\\n", "");

                    JSONObject json = new JSONObject(tmpMsg);  

                    if(json.get("type").toString().contains("preview")) {
                                System.out.println("PREVIEW: " + json.get("msg").toString());



                            }


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }      
4

2 回答 2

2

您不应该创建一个新BufferedReader的来接收每条消息。如果两条消息连续快速到达,它可能会从 中拉出多条消息is,然后您将丢弃内容。in在循环之外声明while(并适当处理关闭条件)。

于 2013-09-02T16:12:29.403 回答
0

我认为您想要的是一个 ServerSocket - 它侦听并处理传入连接的队列(默认大小为 50),这样您就不会丢失连接。正如您的代码一样,如果在一个连接建立和循环再次连接到 connect() 之间的时间内尝试连接,则不会有任何监听。

于 2013-09-02T16:14:04.940 回答