有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    是的,多亏了上面评论部分的Rocco,我解决了这个问题。问题在于它的功能。删除()部分。我从另一个项目复制/粘贴了这个hashmap迭代代码,因为在我的记忆中,这个hashmap迭代器只是简单的迭代,但它有一个简单的定义。最后删除(),对此我不记得了