2016-07-19 3 views
0

私は単純なチャットクライアント/サーバーのペアを作成しようとしていて、壁に衝突しました。 1つのクライアントでメッセージを送信するとき以外は、基本的にはすべてが機能していますが、メッセージを送信したクライアントにのみ戻されます。ここで私のjavaチャットサーバープログラムは接続されている各ユーザーにブロードキャストされません

は、サーバーの私のコードです:

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class ChatServer 
{ 
    public static ServerSocket servSock; 
    public static int port; 
    protected List<ChatHandler> clients; 

    public static void main(String[] args) throws IOException 
    { 
     System.out.println("Applegate Chat Server is now starting."); 
     try 
     { 
      port = Integer.parseInt(args[0]); 
      servSock = new ServerSocket(port); 
      System.out.println("Now listening on port " + port + "."); 
     } 
     catch (ArrayIndexOutOfBoundsException e) 
     { 
      System.err.println("Usage: java ChatServer <port>"); 
      System.exit(0); 
     } 
     ChatServer w = new ChatServer(); 
     w.runServer(); 
    } 

    public void runServer() 
    { 
     try 
     { 
      while (true) 
      { 
       Socket userSocket = servSock.accept(); 
       InetAddress userIP = userSocket.getInetAddress(); 
       System.out.println("Accepted connection from " + userIP.getHostName()); 
       ChatHandler ch = new ChatHandler(userSocket, userIP); 
       clients = new ArrayList<>(); 
       synchronized (clients) 
       { 
        clients.add(ch); 
       } 
       ch.start(); 
      } 
     } 
     catch (IOException e) 
     { 
      System.out.println("IO Exception in runServer: " + e); 
     } 
    } 

    protected class ChatHandler extends Thread 
    { 
     protected Socket clientSock; 
     protected BufferedReader in; 
     protected PrintWriter out; 
     protected InetAddress clientIP; 
     protected String login; 

     public ChatHandler(Socket sock, InetAddress clnt) throws IOException 
     { 
      clientSock = sock; 
      clientIP = clnt; 
      in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
      out = new PrintWriter(sock.getOutputStream(), true); 
     } 

     public void run() 
     { 
      String line; 
      try 
      { 
       while((line = in.readLine()) != null) 
       { 
        out.println(line); 
       } 
      } 
      catch (IOException e) 
      { 
       System.out.println("IO Exception: " + e); 
      } 
     } 
    } 
} 

答えて

1

接続を受け入れながらあなたは新しいクライアントリストを毎回作っています。これを試してみてください:

try 
    { 
     clients = new ArrayList<>(); // <--- 
     while (true) 
     { 
      Socket userSocket = servSock.accept(); 
      InetAddress userIP = userSocket.getInetAddress(); 
      System.out.println("Accepted connection from " + userIP.getHostName()); 
      ChatHandler ch = new ChatHandler(userSocket, userIP); 
      synchronized (clients) 
      { 
       clients.add(ch); 
      } 
      ch.start(); 
     } 
    } 

さらにチャットサーバーでは、受信したメッセージをあるクライアントから他のすべてのクライアントに送信する機能が必要です。

public void sendToAll(String msg) { 
    synchronized (clients) { 
     for (Socket c : clients){ 
      c.getOutputStream().write((msg + "\n").getBytes(_encoding)); 
      c.getOutputStream().flush(); 
     } 
    } 
} 

次のステップは、その機能を使用するためにChatHandlerスレッドを変更することです:

protected class ChatHandler extends Thread 
{ 
    protected Socket clientSock; 
    protected BufferedReader in; 
    protected PrintWriter out; 
    protected InetAddress clientIP; 
    protected String login; 

    protected ChatServer server; // <-- 

    public ChatHandler(Socket sock, InetAddress clnt, ChatServer server) throws IOException 
    { 
     this.server = server; // <-- 
     clientSock = sock; 
     clientIP = clnt; 
     in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
     out = new PrintWriter(sock.getOutputStream(), true); 
    } 

    public void run() 
    { 
     String line; 
     try 
     { 
      while((line = in.readLine()) != null) 
      { 
       //out.println(line); 
       server.sendToAll(line); // <-- 
      } 
     } 
     catch (IOException e) 
     { 
      System.out.println("IO Exception: " + e); 
     } 
    } 
} 
+0

は、どのように私は、スレッドは、すべての人に受信したメッセージを送信することになるだろうか? –

関連する問題