java计时器和套接字问题

时间:2010-04-20 06:31:13

标签: java sockets timer

我正在尝试使用套接字编程和计时器

创建一个监听客户端输入流的程序

但每当计时器执行.. 它被绞死了

请帮帮我

这是代码......

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    try

    {
        ServerUserName=jTextField1.getText();
        ss=new ServerSocket(5000);
        jButton1.enable(false);
        jTextArea1.enable(true);
        jTextField2.enable(true);
        Timer t=new Timer(2000, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try
                {
                    s=ss.accept();                    
                    InputStream is=s.getInputStream();
                    DataInputStream dis=new DataInputStream(is);
                    jTextArea1.append(dis.readUTF());

                }
                catch(IOException IOE)
                {
                }
                catch(Exception ex)
                {
                    setLbl(ex.getMessage());
                }

            }
        });
        t.start();
    }
    catch(IOException IOE)
    {

    }
}

提前致谢

3 个答案:

答案 0 :(得分:4)

使程序多线程;一个线程侦听套接字,另一个线程处理GUI。使用SwingUtilities.invokeLater让GUI线程(“事件调度线程”)在网络线程接收数据时进行GUI更新。

答案 1 :(得分:1)

每次调用accept都会等待新客户端连接到服务器。呼叫将阻塞,直到建立连接。听起来你有一个客户端维护与服务器的连接。

一种解决方案是拉

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

在代码的计时器部分之外。

更新:请注意,如果没有可供读取的数据,readUTF仍会阻止。

答案 2 :(得分:0)

我认为您想使用套接字超时而不是计时器:

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