java 服务器线程套接字忽略使用readLine调用的方法

2izufjch  于 2023-01-15  发布在  Java
关注(0)|答案(1)|浏览(110)

我有一个P2P网络,其中的节点持有key:value的记录,当被请求的节点没有持有所需的key时,它可以将请求传递给网络上的其他节点。该操作总是返回"OK"或"ERROR"。然而,当接收到请求的服务器线程通过调用一个方法将其传递给所有其他连接的节点时,该方法不会捕获应答("OK"或"ERROR"),而是通过run()中的主循环捕获。以下是简化的代码:服务器线程类的run()方法:

public void run(){
        String line;
            try {
                while (true){
                    line=in.readLine();
                    if(line!=null){
                        else{
                            switch (line.split(" ")[0]){
                                case "set-value":
                                    out.println(setValue(line.split(" ")[1]));
                                    break;
                                    System.out.println("default:");
                                    System.out.println(line);
                                    break;
                            }
                        }
                    }
                }
            } catch (IOException e) {
                System.out.println("connection closed with: "+socket.getInetAddress().getHostAddress()+":"+socket.getPort()+" (server socket)");
            }
    }

setvalue()方法:

private String setValue(String arg) throws IOException {
        String setKey = arg.split(":")[0];
        String setValue = arg.split(":")[1];
        if(DatabaseNode.getKey().equals(setKey)){
            DatabaseNode.setValue(setValue);
            System.out.println("set-value successful, current record: "+DatabaseNode.getKey()+":"+DatabaseNode.getValue());
            return "OK";
        } else {
            System.out.println("key not on this node, searching...");
            for (ServerConnect sc : DatabaseNode.getConnectToClient()) {
                System.out.println("sending set-value to: "+sc);
                if(sc.sendRead("set-value "+arg ).equals("OK")) {
                    return "OK";
                }
            }
            for (ServerThread st : DatabaseNode.getConnectedToServer()) {
                if(st != this) {
                    System.out.println("sending set-value to: "+st);
                    if(st.sendRead("set-value "+arg).equals("OK")) {
                        return "OK";
                    }
                }
            }
        }
        return "ERROR";
    }

还有一个有问题的函数sendRead(),它应该发送一个字符串并等待anwser,但却被忽略了,anwser被主run()方法捕获

public String sendRead(String str) throws IOException {
        out.println(str);
        String line;
        System.out.println("sent "+str+" awaiting response...");
        line = in.readLine();
        System.out.println("got "+line);
        return line;
    }

谢谢你的帮忙
我试着识别传入行上的线程,我绝对肯定应该从方法读取的同一个线程只是启动了一个新循环,并且没有使用sendRead()。套接字不是静态的,BufferedReader上的autoFlush已启用。

0pizxfdo

0pizxfdo1#

我刚刚发现了问题所在,run()中的readLine()调用窃取了下一行,使方法挂起。

相关问题