2016-04-25 19 views
2

Wie kann ich eine Nachricht vom Server an einen bestimmten Client senden. Ich habe das Konzept, wie man es macht, wie ich eine Liste aller Klienten machen muss, die an Server angeschlossen werden, und indem ich jeden Klienten iterate, kann ich Nachricht senden, aber ich werde dankbar sein, wenn irgendjemand mir durch Code helfen kann. Ich habe gesucht viele Codes, aber ich habe keine nennenswerte Hilfe von ihnen erhalten Code sollte nicht GUI-basiert sein. Danke im Voraus. Entschuldigung für mein schlechtes Englisch. Dies ist mein Code, in dem Nachrichten an alle Kunden ist senden, aber ich möchte Nachricht an einen Client meiner Wahl senden ipaddress mit Kundensenden Sie eine Nachricht an bestimmte Clients mit 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

Ich habe gerade gesehen, dass Sie dies als separate Frage hinzugefügt haben. Es hängt davon ab, wie Sie den Client identifizieren möchten, den Sie auswählen möchten. Weißt du, wie du das willst? –

+0

Ja Sir, sobald der Client mit dem Server verbunden ist, sendet er seine IP-Adresse und seinen Benutzernamen an den Server und jetzt mit ipdressess möchte ich eine Nachricht an einen bestimmten Client senden. Eine Option, die ich habe, ist, wenn ich die Nachricht an den Client der IP-Adresse senden möchte 192.168.1.1 Dann werde ich die Nachricht und die IP-Adresse an alle Clients senden und dann einfach auf Client-Seite überprüfen, welcher Client diese IPADRESS hat und wenn einer von ihnen diese IPADRESS-Anzeige diese Meldung an ihn haben –

+0

@MICHELMARKIDIS –

Antwort

1

Sie eine Beziehung zwischen speichern können, wie Sie den Client nachschlagen möchten mit der Sockel, auf dem sie sich befinden. Der natürliche Weg, dies zu tun, ist mit einer Karte, wie

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

Offensichtlich in diesem Beispiel hier, würde der Kunde seine/ihre Benutzernamen in einem Format senden, die Sie, nachdem Sie die Socket-Verbindung zu erhalten erwarten

+0

Ich denke, es sollte sei sockets.put (userID, s) @ControlAltDel –

1

Was ich tun würde, ist eine Client-Klasse erstellen:

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; 
    } 
} 

Statt nur den Sockel und die Portnummer auf die Karte hinzuzufügen, würde ich die Kombination von benutzername und ipAddres zu einem Client-Objekt zuordnen.

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); 

Jetzt können Sie eine Nachricht an einen bestimmten Client auf dem Benutzernamen und ipAddress basierend senden:

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

ich Socket.getInetAddress() verwenden würde und vergleichen Sie das Ergebnis, was auch immer Sie haben die IPs Sie wollen senden an. Persönlich würde ich dafür einen String[] oder ArrayList<String> verwenden. Hier ein Beispiel:

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(); 
    } 
} 

Alternativ Sie die Steckdosen in Ihrem HashMap durch die InetAddress stattdessen speichern könnten.

0

Ich habe festgestellt, dass es effektiv ist, einen Objekttyp zu schaffen, die es sowohl ein eindeutiger Name oder ID sein, eine int oder ein String und auch ein Socket halten kann. Sie könnten Instanzen dieses Objekts in einer ArrayList (oder einer anderen Liste) speichern und sie bei der Suche nach dem Namen oder der ID, die Sie verwenden möchten, durchlaufen.

Verwandte Themen