2016-05-10 9 views
0

私はチャットシステムプロジェクト(まだ不完全です)をJavaで作成しようとしていますが、クライアントの受信メッセージを転送するのに少し助けが必要です。どのクライアントからどのクライアントから受け取ったメッセージをJavaのすべての接続されたクライアントに転送する方法

サーバーがマルチスレッドとして機能しているので、多くのクライアントが接続できるようになります。(想定されるシナリオ)6つのクライアントがサーバーに接続されていて、そのうちの1つがメッセージを送信した場合、接続されたすべてのクライアントにサーバー経由で接続します。ここ

import java.io.*; 
import java.net.*; 
public class ChatServer implements Runnable 
{ 
    Socket csocket; 
    ChatServer(Socket csocket){ this.csocket = csocket; } 

public static void main(String[]args)throws Exception 
{ 
    ServerSocket sersock=new ServerSocket(3000); 
    System.out.println("Server ready for chatting"); 
    while(true) 
    { 
     Socket sock =sersock.accept(); 
     new Thread(new ChatServer(sock)).start();} 
} 
public void run() 
{ 
    try{ 
      System.out.println(Thread.currentThread().getName() + ": HELLO"); 
      BufferedReader keyRead=new BufferedReader(new InputStreamReader(System.in)); 
      OutputStream ostream=csocket.getOutputStream(); 
      PrintWriter pwrite=new PrintWriter(ostream, true); 
      InputStream istream=csocket.getInputStream(); 
      BufferedReader receiveRead=new BufferedReader(new InputStreamReader(istream)); 
      String receiveMessage, sendMessage; 

      while(true) { 
        if((receiveMessage=receiveRead.readLine())!=null) 
         { 
          System.out.print(Thread.currentThread().getName() + ": "); 
          if(receiveMessage.equals("QUIT")) 
           Thread.currentThread().stop(); 
           else 
            System.out.println(receiveMessage);} 
         sendMessage=keyRead.readLine(); 
         pwrite.println(sendMessage); 
         System.out.flush();} 
     } catch (IOException e){ System.out.println(e); } 

} 

} 

クライアント側事前に

import java.io.*; 
import java.net.*; 
public class ChatClient 
{ 
public static void main(String[]args)throws Exception 
{ 
Socket sock =new Socket("localhost", 3000); 
// reading from keyboard (keyRead object) 
BufferedReader keyRead=new BufferedReader(new InputStreamReader(System.in)); 
// sending to client (pwrite object) 
OutputStream ostream=sock.getOutputStream(); 
PrintWriter pwrite=new PrintWriter(ostream, true); 

// receiving from server (receiveRead object) 
InputStream istream=sock.getInputStream(); 
BufferedReader receiveRead=new BufferedReader(new InputStreamReader(istream)); 

System.out.println("Start the chitchat, type and press Enter key"); 

String receiveMessage, sendMessage; 
while(true) 
{ 
sendMessage=keyRead.readLine();// keyboard reading 
pwrite.println(sendMessage);// sending to server 
System.out.flush();// flush the data 
    if((receiveMessage=receiveRead.readLine())!=null)//receive from server 
{ 
System.out.println(receiveMessage);// displaying at DOS prompt 
} 
} 
} 
} 

おかげ

サーバー側。2つのコードです。

+0

クライアントがサーバーに接続するときは、クライアント側のソケットをサーバー側のマップに格納します。クライアントがメッセージを送信すると、マップ上のすべてのソケットを繰り返してメッセージを送信します。 –

+0

役に立つリンク:http://cs.lmu.edu/~ray/notes/javanetexamples/#chat –

答えて

0

私は、これらのタイプのサーバーアプリケーションを、直接の接続が不可能な場合にリレーサーバー経由でクライアントに接続する方法として頻繁に書き込みます。解決方法は簡単ですが、accept()関数から受け取った各socketを選択したリストまたはツリーに入れてください。

List<Socket> connectionList = new ArrayList<Socket>(); 
... 
Socket sock =sersock.accept(); 
connectionList.add(sock); 
... 
for (Socket connection : connectionList) { 
     connection.getOutputStream().write(msgBytes); 
} 
+0

回答者のおかげで:)、Andy氏は、コードのどの部分でこれらのコマンドを使用すべきか教えていただけますか?私は本当にリストに慣れていないからです。 –

+0

新しいメッセージを受け取った後、サーバのスレッドに入れてください。上記のコードforループを使用して、接続されているすべてのクライアントに応答を送信します。あなたが答えが好きなら、upvoteしてください。 – Andy

+0

返信ありがとうアンディさん私はあなたが言ったことを試みたが、私はこのメッセージを "記号メソッド書き込み(java.lang.String)を見つけることができません"、任意のアイデアを得ていますか? –

関連する問題