2010-04-20 59 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();