2012-05-16 38 views
0

這是程序的客戶端部分。 我有這樣的類,它與套接字一起工作,並具有讀取和寫入服務器的方法 如何使一個事件捕獲來自服務器的消息? 某些actionListener只在inputStream中有消息時纔會執行操作。 我試過了調用Running.receiveLine()的計時器;但它工作非常糟糕。 while(true)的解決方案似乎也不好。如何從InputStream捕獲事件?

public class Running extends Thread{ 
private Socket s; 
private PrintStream ps; 
private BufferedReader br; 

public Running(){ 
try{ 
    s = new Socket(InetAddress.getLocalHost(), 8072); 
    ps = new PrintStream(s.getOutputStream()); 
    br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
} catch (UnknownHostException ex) { 
    System.out.println("11"); 
    ex.printStackTrace(); 
} catch (IOException ex) { 
    System.out.println("00"); 
    ex.printStackTrace(); 
} 
} 

public String receiveLine(){ 
    String ret = ""; 
    try { 
     ret = br.readLine(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return ret; 
} 

public void sendLine(String s){ 
    ps.println(s); 
} 

public void close(){ 
    try { 
     s.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
    } 
+0

嗯,你可能想要(真)。它出什麼問題了? – keyser

+0

我不知道如何將它連接到Swing界面。 –

+0

只是爲了通知你...你正在擴展java.lang.Thread,但你沒有正確使用它。在這種情況下,您不會從擴展java.lang.Thread中獲益。如果你想,你應該實現run()方法,然後調用線程的start()方法。 –

回答

0

我認爲這是不使用方法read()因爲它可以阻止流動,直到新的數據部分可用的問題。所有標準的Java輸入流都基於監視器很好地實現了這種方法。所以你的線程在等待期間不會吃掉CPU和其他資源。

另外,您可以參考Java NIO中的非阻塞IO。

小增加。 要與Swing一起使用,您可以使用隊列方法與SwingWorker進行融合。