2016-04-08 9 views
1

私は、複数の異なるクライアントがサーバー出力コンソールを介して互いにチャットできるようにする簡単なチャットサーバーを作成しようとしています。それぞれ独自のスレッドを持つクライアントは、サーバーに書き込みを行い、コンソールを介してサーバーの標準出力に結果を表示できます。しかし、私はBufferedReaderに複数のクライアントソケット接続からのメッセージを受け取ることができません。異なるソケット接続を持つクライアントからの複数の入力ストリームをサーバーが受け入れる方法を教えてください。

現在、最初のクライアントスレッドはソケットを介してBufferedReaderへの排他的アクセス権を得ています。しかし、私は複数のクライアントがサーバーの入力ストリームリーダーに接続し、別個のソケット接続を持つ複数のクライアントスレッドからの入力を待つようにしたいと思います。クライアントが同時にサーバーに投稿できるようにしたいと思います。私は入力ストリームリーダーとしてBufferedReaderの有無にかかわらずどのようにこれを達成しますか?

public class chatServer { 

    public chatServer() throws IOException { 

     int PORT = 8189; 

     try (ServerSocket server = new ServerSocket(PORT)) { 
      System.out.println("The server is running at " 
        + InetAddress.getByName(null) + "..."); 
      String rules = "The rules of this server are as follows:\n" 
        + "1.Respect your fellow chatters\n" 
        + "2.Vulgar language will result in punishment\n" 
        + "3.We reserve the right to ban you at any time.\n" 
        + "Enjoy!"; 

      System.out.println(rules + "\n"); 

      while (true) { 
       try { 
        new clientHandler(server.accept()).run(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     chatServer cs = new chatServer(); 
    } 

    class clientHandler implements Runnable { 

     Socket socket; 

     public clientHandler(Socket socket) { 
      this.socket = socket; 
     } 

     public void run() { 

      try { 
       BufferedReader in = new BufferedReader(new InputStreamReader(
         socket.getInputStream())); 

       String line; 
       while (true) { 
        line = in.readLine(); 
        if ((line == null) || line.equalsIgnoreCase("exit")) { 
         // socket.close(); 
        } else { 
         System.out.println(socket.getPort() + " > " + line); 
        } 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 

    } 
} 

public class chatClient { 

    private Socket socket; 
    private String name = ""; 
    private String IP = "127.0.0.1"; 
    private int PORT = 8189; 


    public chatClient(String name, String IP, int PORT) throws UnknownHostException, IOException{ 

     this.name = name; 
     socket = new Socket(this.IP,this.PORT); 

    } 

    public static void main(String[] args) throws UnknownHostException, IOException{ 

     chatClient c1 = new chatClient("John",null,0); 
     chatClient.connect(c1); 

    } 

    public static void connect(chatClient cc) throws IOException { 

     Socket socket = cc.socket; 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     out.println("Welcome " + cc.name); 

     String message = ""; 
     boolean done = false; 
     Scanner stdin = new Scanner(System.in); 
     System.out.println("Type your message here:"); 

     while(!done){ 
     System.out.print("> "); 
     message = stdin.nextLine(); 
     out.println(message); 

     if(message.trim().equalsIgnoreCase("exit")){ 
      done = true; 
     } 

     } 
    } 

} 

アップデート:私は明確なソケット接続で様々なクライアントからの複数の投稿を受け付けServerの機能を達成するための代替/適切な方法を探していますか?私の現在の実装がそうすることができない場合、どうすればそれを変更することができますか?

答えて

2

BufferedReaderは、1つのリーダーを中心に構成されています.1つのリーダーは、1つのデータソースに直接的または間接的に接続されています。一度構築されたものを変更する方法はありません。

要するにあなたの質問は理にかなっていません。各クライアントには別個のソケットがあります。ソケットには独自の入力ストリームと出力ストリームがあり、順番にクライアントごとに異なるBufferedTeaderにラップする必要があります。すべてのクライアント間で共有されるものではありません。

EDIT実際の問題はBufferedReadersとは関係ありません。ここにあります:

new clientHandler(server.accept()).run(); 

ハンドラを別のスレッドとしてではなくインラインで実行しています。 run()は、私は複数のクライアント間での並べ替えの何かを共有することができるように、私はBufferedReaderのの代わりに使用することができますどのような

new Thread(new clientHandler(socket.accept())).start(); 
+0

でなければなりません。私は別のソケット接続でさまざまなクライアントからの複数の投稿を受け入れるサーバーを達成するための適切なメソッドを探していますか? – Delrog

+0

これを排除するものは何もありません。あなたはバッファリングされた読者がどのように働くかについて悪い仮定をしました。 Javaチュートリアルのカスタムネットワーキングのセクションを見る必要があります。 – EJP

+0

clientHandlerとThreadとの違いは何ですか?問題を引き起こしたRunnableを実装していますか? 「ハンドラをインラインで実行する」とはどういう意味ですか? – Delrog

関連する問題