java timer and socket problem

后端 未结 3 1227
再見小時候
再見小時候 2020-12-21 11:28

I\'m trying to make a program which listens to the client input stream by using socket programming and timer

but whenever timer executes.. it gets hanged

Ple

相关标签:
3条回答
  • 2020-12-21 11:42

    I think you want to use socket timeouts instead of a timer:

    Thread listener = new Thread() {
        ServerSocket ss;
    
        @Override
        public void run() {
            try {
                ss = new ServerSocket(5000);
                ss.setSoTimeout(2000);
                try {
                    while (true) {
                        try {
                            final String text = acceptText();
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    jTextArea1.append(text);
                                }
                            });
                        } catch (final Exception ex) {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    setLbl(ex.getMessage());
                                }
                            });
                        }
                    }
                } finally {
                    ss.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        private String acceptText() throws IOException {
            Socket s = ss.accept();
            try {
                InputStream is=s.getInputStream();
                try {
                    DataInputStream dis=new DataInputStream(is);
                    return dis.readUTF();
                } finally {
                    is.close();
                }
            } finally {
                s.close();
            }
        }
    };
    listener.setDaemon(true);
    listener.start();
    
    0 讨论(0)
  • 2020-12-21 11:56

    Make the program multi-threaded; one thread listens on the socket, the other one handles the GUI. Use SwingUtilities.invokeLater to let the GUI thread ("event dispatching thread") do the GUI updates whenever the network thread receives data.

    0 讨论(0)
  • 2020-12-21 11:58

    Every call to accept waits for a new client to connect to the server. The call blocks until a connection is established. It sounds like you have a single client that maintains a connection to the server.

    One solution is to pull

    s=ss.accept();                    
    InputStream is=s.getInputStream();
    DataInputStream dis=new DataInputStream(is);
    

    outside of the timer portion of the code.

    Update: Be aware though that readUTF is still going to block if there is no data available to be read.

    0 讨论(0)
提交回复
热议问题