我正在練習Java併發性並使用聊天客戶端/服務器進行學習。Java控制檯/併發讀寫
目前我需要一對終端窗口(接收器和發件人)每個客戶端。所以真的有一組發送者客戶端和一組接收者客戶端,我只是認爲它們是成對的。
有沒有一種簡單的方法可以同時輸入數據和接收控制檯/終端數據?
如果它有所作爲,我不需要回顯輸入,只需要輸出服務器的輸出。終端是bash,所以也許有一個簡單的終端解決方案?
我正在練習Java併發性並使用聊天客戶端/服務器進行學習。Java控制檯/併發讀寫
目前我需要一對終端窗口(接收器和發件人)每個客戶端。所以真的有一組發送者客戶端和一組接收者客戶端,我只是認爲它們是成對的。
有沒有一種簡單的方法可以同時輸入數據和接收控制檯/終端數據?
如果它有所作爲,我不需要回顯輸入,只需要輸出服務器的輸出。終端是bash,所以也許有一個簡單的終端解決方案?
原則上,不應該有寫入和讀取同一終端的問題 - 只需使用不同的線程進行輸入和輸出。不過,當你的輸入位於它之間時,你的輸出可能看起來有點受損。爲了避免這種情況,並且有一個窗口化的終端,你需要對你的終端講話,這在不同的系統上是不同的,並且可能需要JNI(或者一些JNI包裝庫)。
控制檯(即標準輸入和輸出流)由操作系統在啓動時提供給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
每一行你然後鍵入該控制檯,然後將從服務器回顯給您。
祝您的項目順利!
我有工作的客戶和一個工作服務器已經。這只是一個好奇心問題。我是腦力激盪的方式,爲每個終端重新導入標準。也許我可以在啓動客戶端之前將stdin重定向到管道,並讓我的客戶端異步讀取... – Quaternion
你可能會看到如果這個[示例](http://stackoverflow.com/questions/3245805)會apropos。 – trashgod
我知道擺動解決方案可行......但我現在很偏向於這些終端窗口。真的,這似乎是這樣一個簡單的事情。 – Quaternion