2011-03-12 14 views
0

私はJavaの同時実行を実践しており、学習のためにチャットクライアント/サーバーを使用しています。Javaコンソール/読み書き同時実行

現在、クライアントごとに1組の端末ウィンドウ(受信者と送信者)が必要です。だから本当に送信者クライアントのグループと受信者のクライアントのグループがあります、私はペアでそれらを考慮する。

データを入力してコンソール/端末データを同時に受信できる簡単な方法はありますか?

違いがある場合は、入力をエコーする必要はありません。サーバからの出力だけです。また、端末はbashですので、単純な端末ソリューションがありますか?

+0

この[example](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

私は働いているクライアントと既に働いているサーバーを持っています。好奇心の問題です。私は、各端末の標準的な入出力をリダイレクトする方法を突きつけている。クライアントを開始する前に標準入力をパイプにリダイレクトして、クライアントから非同期にそれを読み取らせることができます。 – Quaternion

関連する問題