2011-03-12 43 views
0

我正在練習Java併發性並使用聊天客戶端/服務器進行學習。Java控制檯/併發讀寫

目前我需要一對終端窗口(接收器和發件人)每個客戶端。所以真的有一組發送者客戶端和一組接收者客戶端,我只是認爲它們是成對的。

有沒有一種簡單的方法可以同時輸入數據和接收控制檯/終端數據?

如果它有所作爲,我不需要回顯輸入,只需要輸出服務器的輸出。終端是bash,所以也許有一個簡單的終端解決方案?

+0

你可能會看到如果這個[示例](http://stackoverflow.com/questions/3245805)會apropos。 – trashgod

+0

我知道擺動解決方案可行......但我現在很偏向於這些終端窗口。真的,這似乎是這樣一個簡單的事情。 – Quaternion

回答

1

原則上,不應該有寫入和讀取同一終端的問題 - 只需使用不同的線程進行輸入和輸出。不過,當你的輸入位於它之間時,你的輸出可能看起來有點受損。爲了避免這種情況,並且有一個窗口化的終端,你需要對你的終端講話,這在不同的系統上是不同的,並且可能需要JNI(或者一些JNI包裝庫)。

0

控制檯(即標準輸入和輸出流)由操作系統在啓動時提供給java進程。我知道沒有可以提供多個控制檯的操作系統。

因此,我建議您將客戶端和服務器作爲單獨的Java進程啓動,並讓它們通過TCP進行通信。根據你的目標,你可以實現一個現有的通信協議,比如Telnet或者IRC,這樣你就可以使用現有的客戶端應用程序來處理這些協議,並且提供所有這些協議,但是可能會讓你執行比你更多的命令可能需要,或者定義你自己的簡單協議,在這種情況下你也必須實現客戶端。去了解後者

一種方式是做這樣的事情:

public class Client { 
    public static void main(String[] args) throws Exception { 
     Socket s = new Socket(args[0], Integer.parseInt(args[1])); 
     new Repeater(System.in, s.getOutputStream()).start(); 
     new Repeater(s.getInputStream(), System.out).start(); 
    } 
} 


public class Server { 
    public static void main(String[] args) throws Exception { 
     ServerSocket ss = new ServerSocket(Integer.parseInt(args[0])); 
     for (;;) { 
      Socket s = ss.accept(); 
      // simply echo for now. You can do more interesting things here ... 
      new Repeater(s.getInputStream(), s.getOutputStream()).start(); 
     } 
    } 
} 



class Repeater extends Thread { 
    final InputStream in; 
    final OutputStream out; 

    public Repeater(InputStream in, OutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    @Override public void run() { 
     try { 
      byte[] buf = new byte[4096]; 
      int r; 
      while ((r = in.read(buf)) != -1) { 
       out.write(buf, 0, r); 
       out.flush(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

那麼你可以這樣做:

java Server 55555 

,並在另一個控制檯

java Client localhost 55555 

每一行你然後鍵入該控制檯,然後將從服務器回顯給您。

祝您的項目順利!

+0

我有工作的客戶和一個工作服務器已經。這只是一個好奇心問題。我是腦力激盪的方式,爲每個終端重新導入標準。也許我可以在啓動客戶端之前將stdin重定向到管道,並讓我的客戶端異步讀取... – Quaternion