2016-04-25 85 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我想发送消息到任何特定的客户端我有一个选项是,如果我想发送消息到客户端的IP地址192.168.1.1然后我会发送消息和IP地址给所有的客户,然后简单地在客户端应用检查哪个客户端有该IP地址,并且如果他们中的任何一个具有该IP地址显示给他的消息 –

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

显然,在这里这个例子中,客户将不得不送他/她的用户名中,你希望做的Socket连接

之后接收格式
+0

我认为它应该是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); 

现在,你可以将消息发送到基于用户名和ip地址特定的客户端:

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

我发现创建一个既可以包含唯一名称也可以包含唯一标识的对象类型是有效的,例如intStringSocket。您可以将此对象的实例存储在ArrayList(或任何其他列表)中,并遍历它们以搜索要使用的名称或标识。

相关问题