javasocket在发送消息后被神秘地从hashmap中删除
所以我对javasocket还不熟悉,并且刚刚开始使用它们。问题是:我有一个客户端和一个服务器应用程序。客户端希望向另一个客户端发送一些消息。这些消息将到达服务器,在服务器端,我将它们放入队列中,并每2秒检查一次目标客户机(socket)是否处于活动状态。如果是这样,那么我将清空队列并将每条消息发送到特定的客户端。否则,消息将存储在服务器应用程序中,直到目标socket处于活动状态
然而,主要的问题是,在服务器将第一条消息传递到socket之后,客户端(目标)socket就会消失。我尝试将这些socket存储在hashmap中。因此,在发送第一条消息之后,hashmap不知何故变为空。我无法传达其余的信息
我提供了一些代码:
public class Server {
public static volatile HashMap<Socket,String> clients;
public Server(){
clients = new HashMap<>();
}
public void start(){
try(ServerSocket serverSocket = new ServerSocket(5000)){
while(true){
Socket socket = serverSocket.accept();
System.out.println("Client connected");
new clientHandler(socket).start();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public class clientHandler extends Thread{
private Socket socket;
private Socket sendSocket;
private Timer timer;
private Queue<String> msgStack;
private String socketName = "";
public clientHandler(Socket socket){
this.socket = socket;
msgStack = new PriorityQueue<>();
}
@Override
public void run(){
try {
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter output = new PrintWriter(socket.getOutputStream(),true);
while(true){
String line = input.readLine();
if(!line.contains("|") && line != null){
if(!isClientAdded(line)){
Server.clients.put(socket, line);
}
}else{
System.out.println(line);
String[] msg = line.split("\\|");
String fromUser = msg[0];
String toUser = msg[1];
String subject = msg[2];
String msgText = msg[3];
if(isClientAdded(toUser)){
sendMsg(line);
if(timer.isRunning()){
timer.stop();
}
}else{
msgStack.add(line);
timer = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(msgStack+" "+msgStack.size());
if(isClientAdded(toUser)){
if(!msgStack.isEmpty()){
sendMsg(msgStack.poll());
System.out.println("MSg: "+fromUser+" "+toUser+" "+subject+" "+msgText);
}
if(msgStack.isEmpty()){
timer.stop();
}
}
}
});
timer.start();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
Server.clients.remove(socket);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public boolean isClientAdded(String clientName){
Iterator it = Server.clients.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
if(clientName.equals(pair.getValue()+"")){
return true;
}
it.remove();
}
return false;
}
public void sendMsg(String send){
String[] msg = send.split("\\|");
String fromUser = msg[0];
String toUser = msg[1];
String subject = msg[2];
String msgText = msg[3];
Iterator it = Server.clients.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
if((pair.getValue()+"").equals(toUser)){
try {
socket = ((Socket)pair.getKey());
PrintWriter output = new PrintWriter(socket.getOutputStream(),true);
output.println(fromUser+"|"+subject+"|"+msg);
} catch (IOException ex) {
ex.printStackTrace();
}
}
it.remove();
}
}
}
我根据每一个socket的对“name”来识别它们。这就是我如何知道我应该发送消息的socket
# 1 楼答案
是的,多亏了上面评论部分的Rocco,我解决了这个问题。问题在于它的功能。删除()部分。我从另一个项目复制/粘贴了这个hashmap迭代代码,因为在我的记忆中,这个hashmap迭代器只是简单的迭代,但它有一个简单的定义。最后删除(),对此我不记得了