2016-04-25 2 views
2

Как отправить сообщение от сервера любому конкретному клиенту. У меня есть концепция, как это сделать, как будто я должен составить список всех клиентов, подключенных к серверу, а затем, итерируя каждого клиента, я могу отправить сообщение, но я буду благодарен, если кто-нибудь может мне помочь по коду. Я искал многие коды, но я не получал от них никакой значительной помощи. Кодекс не должен быть основан на графическом интерфейсе. Спасибо заранее. Прошу прощения за мой плохой английский. Это мой код, в котором будет отправлено сообщение всем клиентам, но я хочу, чтобы отправить сообщение клиенту по своему выбору с помощью клиентов IPAddressотправить сообщение конкретным клиентам с помощью 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; 
    } 
} 

Вместо добавления только сокет и номер порта на карту, я бы карту комбинацию имени пользователя и 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() и сравнить результат к тому, что вы ИПС, которые вы хотите отправьте. Лично я использовал бы для этого 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(); 
    } 
} 

В качестве альтернативы, вы можете хранить сокетов в вашем HashMap в InetAddress вместо этого.

0

Я обнаружил, что эффективно создать тип объекта, который может содержать как уникальное имя, так и идентификатор - это int или String, а также Socket. Вы можете хранить экземпляры этого объекта в ArrayList (или любом другом списке) и выполнять итерацию через них, ища имя или идентификатор, который вы хотите использовать.

Смежные вопросы