2010-04-20 73 views
2

我试图做一个程序,它使用套接字编程和定时器监听客户端的输入流的Java定时器插座问题

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

请帮我出

这里是代码...

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) 
    { 

    } 
} 

在此先感谢

回答

4

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

1

每次拨打accept时都会等待新客户端连接到服务器。呼叫阻塞,直到连接建立。这听起来像你有一个与服务器保持连接的单一客户端。

一种解决方案是拉

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

外代码的定时器部的。

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

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