如何从服务器向任何特定客户端发送消息。我有如何做到这一点的概念,就像我必须列出连接到服务器的所有客户端,然后通过迭代每个客户端我可以发送消息,但我会感谢任何人可以通过代码帮助我。我已经搜索许多代码,但我没有得到任何相当大的帮助代码不应该是基于GUI。在此先感谢。谢谢我的英语不好。 这是我的代码,其中消息发送到所有客户端,但我想使用客户端ipaddress将消息发送到我选择的客户端
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 :(得分:1)
您可以在您希望如何使用它们所在的套接字查找客户端之间存储关系。这样做的自然方式是使用地图,例如
Map<String, Socket> sockets = new HashMap<String,Socket>();
...
ServerSocket ss = ...;
Socket s = ss.accept();
String username = getUserName(s);
sockets.put(username, s);
显然,在此示例中,客户端必须以您希望在进行Socket连接后接收的格式发送他/她的userName
答案 1 :(得分:1)
我要做的是创建一个Client类:
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;
}
}
我不会将套接字和端口号只添加到地图中,而是将userName和ipAddres的组合映射到Client对象。
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();
}
答案 2 :(得分:1)
我使用Socket.getInetAddress()并将结果与您要发送到的IP进行比较。就个人而言,我使用String[]
或{{1} } 为了那个原因。这是一个例子:
ArrayList<String>
或者,您可以通过InetAddress将套接字存储在HashMap中。
答案 3 :(得分:0)
我发现创建一个既可以包含唯一名称也可以包含int
或String
以及Socket
的ID的对象类型是有效的。您可以将此对象的实例存储在ArrayList
(或任何其他列表)中,并遍历它们以搜索您要使用的名称或ID。
答案 4 :(得分:0)
这就是我为我的程序所做的。我使用了“&gt;&gt;”用于指定应将消息发送给特定用户的字符串。 (例如:“Ross&gt;&gt; Hi Ross What Up?”意味着该消息应该发送给名为'Ross'的用户。我使用HashMap(名为“WritersMap”)将细节保存为KEY-VALUE对。密钥将是发送特定消息的用户的名称,Value将是该消息。 'in'是一个BufferedReader实例。
while (true) {
String input = in.readLine();
if (input == null) //if there is no input,do nothing
{
return;
}
//when a user sends a message to a specific user
else if(input.contains(">>")) //checks whether the message contains a >>
{
String person=input.substring(0,input.indexOf(">")); //extract the name of the destination user
for(HashMap.Entry<String,PrintWriter> entry:writersMap.entrySet()) //find the destination user from the users list
{
if(entry.getKey().matches(person)) //if the destination user is found
{
PrintWriter writer=entry.getValue();
writer.println("MESSAGE " + name + ": " + input);
}
}
}
else //when a user sends a broadcast message to all users
{
for(HashMap.Entry<String,PrintWriter> entry:writersMap.entrySet()) //find the destination user from the users list
{
PrintWriter writer=entry.getValue();
writer.println("MESSAGE " + name + ": " + input);
}
}
}