2016-04-25 22 views
2

どのようにサーバーから特定のクライアントにメッセージを送信できますか?私はそれを行う方法の概念を持っているように私はすべてのクライアントのリストをサーバーに接続し、次に各クライアントを反復することによってメッセージを送信できるようにしなければならないが、いずれかがコードによって私を助けることができれば感謝するだろう。多くのコードが、私はそれらからかなりの助けを得ていないコードはGUIベースではありません。事前に感謝します。私の悪い英語のために申し訳ありません。 このメッセージはすべてのクライアントに送信されている私のコードですが、私はあなたがあなたがクライアントを検索する方法との間の関係を保存することができ、クライアントのIPアドレスのJavaを使用して特定のクライアントにメッセージを送信

Map<Integer, java.net.Socket> clients = new HashMap<Integer, java.net.Socket>(); 
socket = serverSocket.accept(); 

// Add the socket to a HashMap 
clients.put(socket.getPort(), socket); 
for (Iterator<Integer> iter = clients.keySet().iterator(); iter.hasNext();) 
{ 
    int key = iter.next(); 

    java.net.Socket client = clients.get(key); 

    // Sending the response back to the client. 
    // Note: Ideally you want all these in a try/catch/finally block 
    OutputStream os = client.getOutputStream(); 
    OutputStreamWriter osw = new OutputStreamWriter(os); 
    BufferedWriter bw = new BufferedWriter(osw); 
    bw.write("Some message"); 
    bw.flush(); 
} 
+0

私はこれを別の質問として追加しました。それは、あなたが選別したいクライアントをどのように識別したいかによって異なります。どのようにしたいのか分かりますか? –

+0

はいクライアントがサーバーに接続すると直ちにサーバーに自分のipadressとユーザー名を送信し、現在はipadressessを使用しています。特定のクライアントにメッセージを送信したい場合は、ipaddressのクライアントにメッセージを送信する場合192.168.1.1次にすべてのクライアントにメッセージとipaddressを送信し、クライアント側でそのクライアントがそのipadressを持っているかどうかを確認してください。もしipadressがそのメッセージを表示していれば –

+0

@MichaelMarkidis –

答えて

1

を使用して私の選択のクライアントにメッセージを送信したいです彼らがいるソケット。これを行うための自然な方法は、マップで、

明らか
Map<String, Socket> sockets = new HashMap<String,Socket>(); 
... 
ServerSocket ss = ...; 
Socket s = ss.accept(); 
String username = getUserName(s); 
sockets.put(username, s); 

のように、ここではこの例では、クライアントは、ソケット接続を行った後に受け取ることを期待した形式で、彼/彼女のユーザ名を送信する必要がありますされ

私はどうなるのか
+0

私はそれをすべきだと思いますbe sockets.put(userID、s)@ControlAltDel –

1

は、クライアントクラスを作成します:

class Client 
{ 
    private String userName; 
    private String ipAddress; 
    private java.net.Socket socket = null; 

    public Client (String userName, String ipAddress, java.net.Socket socket) 
    { 
     this.userName = userName; 
     this.ipAddress = ipAddress; 
     this.socket = socket; 
    } 

    public java.net.Socket getSocket() 
    { 
     return this.socket; 
    } 
} 

代わりのマップにだけソケットとポート番号を追加し、私は、Clientオブジェクトにユーザ名とipAddresの組み合わせをマッピングします。

socket = serverSocket.accept(); 

// get the username from the socket 
// get the ipAddress from the socket 
Client c = new Client(userName, ipAddress, socket); 

// Add the client to a HashMap 
clients.put(userName + ":" + ipAddress, c); 

さて、あなたはユーザ名とipAddressのに基づいて、特定のクライアントにメッセージを送ることができます。

public void sendToOneClient (String userName, String ipAddress, Map<String, Client> clients) 
{ 
    Client c = clients.get(userName + ":" + ipAddress); 

    java.net.Socket socket = c.getSocket(); 

    // Sending the response back to the client. 
    // Note: Ideally you want all these in a try/catch/finally block 
    OutputStream os = socket.getOutputStream(); 
    OutputStreamWriter osw = new OutputStreamWriter(os); 
    BufferedWriter bw = new BufferedWriter(osw); 
    bw.write("Some message"); 
    bw.flush(); 
} 
1

私はSocket.getInetAddress()を使用して、あなたがしたいものは何でもあなたはIPアドレスを持っているに結果を比較したいです個人的には、String[]またはArrayList<String>を使ってください。ここでは例です:

ArrayList<String> addresses; 
//TODO: Add things to 'addresses' 

clients.put(socket.getPort(), socket); 
for (Iterator<Integer> iter = clients.keySet().iterator(); iter.hasNext();) 
{ 
    int key = iter.next(); 

    java.net.Socket client = clients.get(key); 

    //Checking to make sure it's a client we want to send to. 
    if (addresses.contains(client.getInetAddress().toString()) { 
     // Sending the response back to the client. 
     // Note: Ideally you want all these in a try/catch/finally block 
     OutputStream os = client.getOutputStream(); 
     OutputStreamWriter osw = new OutputStreamWriter(os); 
     BufferedWriter bw = new BufferedWriter(osw); 
     bw.write("Some message"); 
     bw.flush(); 
    } 
} 

また、あなたが代わりのInetAddressであなたのHashMapのソケットを格納することができます。

0

intまたはStringSocketである一意の名前またはIDの両方を保持できるオブジェクト型を作成することが有効であることがわかりました。 ArrayList(または他のリスト)にこのオブジェクトのインスタンスを格納し、使用する名前またはIDを検索して繰り返します。

関連する問題