Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从客户端通信回服务器_Java_Multithreading_Sockets - Fatal编程技术网

Java 无法从客户端通信回服务器

Java 无法从客户端通信回服务器,java,multithreading,sockets,Java,Multithreading,Sockets,这是我的服务器类,还有管理员/客户端。。。管理员可以从服务器接收初始消息,但无法回复服务器。创建服务器套接字,当管理员连接到服务器时,接收并打印服务器的消息。虽然一旦服务器的菜单打印出来(“1.登录等…”)。我无法通过控制台输入选项。当管理员打印出从服务器发送的菜单时,它似乎处于死锁状态 /** A server that executes the Simple Bank Access Protocol. */ public class BankServer extends Thread

这是我的服务器类,还有管理员/客户端。。。管理员可以从服务器接收初始消息,但无法回复服务器。创建服务器套接字,当管理员连接到服务器时,接收并打印服务器的消息。虽然一旦服务器的菜单打印出来(“1.登录等…”)。我无法通过控制台输入选项。当管理员打印出从服务器发送的菜单时,它似乎处于死锁状态

/**
   A server that executes the Simple Bank Access Protocol.
*/
public class BankServer extends Thread {  

private Socket sAdmin;
private Scanner inServer;
private PrintWriter outServer;

public static void main(String[] args) throws IOException {
    Bank bank = new Bank(10);
    ServerSocket server = new ServerSocket(8888);
    System.out.println("Waiting for clients to connect...");
    Thread admin = new BankServer();
    admin.start();
    while (true) {
        Socket s = server.accept();
        System.out.println("Client connected.");
        BankService service = new BankService(s, bank);
        Thread t = new Thread(service);
        t.start();
    }
}

@SuppressWarnings("resource")
public void run() {
    try {
        ServerSocket server = new ServerSocket(8889);
        try {
            System.out.println("Waiting for admin to connect...");
            while (true) {
                sAdmin = server.accept();
                System.out.println("Admin connected.");
                InputStream instream = sAdmin.getInputStream();
                OutputStream outstream = sAdmin.getOutputStream();
                inServer = new Scanner(instream);
                outServer = new PrintWriter(outstream);
                outServer.print(...+"1. Login\n"+etc...);
                outServer.flush();
                findCommand();
            }
        } finally {
            sAdmin.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void findCommand() throws IOException {
    while (true) {
        if (!inServer.hasNext()) {
            return;
        }
        String command = inServer.next();
        String chosenCommand;
        switch (command) {
            case "1":
                chosenCommand = "LOGIN";
                runCommand(chosenCommand);
                break;
            case "2":
            etc...
        }
    }
}
...
}
为了便于阅读,我删除了runCommand方法和一些不会引起问题的字段

下面是admin类的示例。它将输出从服务器发送的选项,但不会退出输出初始消息的循环,并允许我输入选项

public class BankAdmin {
public static void main(String[] args) throws IOException {
    Socket inAdmin = new Socket("localhost", 8889);
    InputStream instream = inAdmin.getInputStream();
    OutputStream outstream = inAdmin.getOutputStream();
    Scanner in = new Scanner(instream);
    PrintWriter adminOut = new PrintWriter(outstream);
    Scanner console = new Scanner(System.in);

    while (true) {
        if (!in.hasNextLine()) {
            String command = console.next();
            System.out.println("Sending: " + command);
            adminOut.print("command");
            adminOut.flush();
        } else {
            String response = in.nextLine();
            System.out.println(response);
        }
    }
}
}

这就是正在发生的事情:

服务器将菜单发送到客户端后,客户端会卡在.hasNextLine()中。这是因为.hasNextLine()中的
将阻止(暂停)输入,等待新行(否则,它无法确定是否有下一行)。要解决此问题,必须使用线程,一个线程等待输入,另一个线程从控制台读取


有关更多信息,请参见

代码太多,范围太广是一个问题。请考虑减少代码,使问题更加具体化。删除一个方法,希望能使它更容易阅读。<代码>但不能回复服务器 >你怎么知道?你有错误吗?它是否发送但客户端从未收到?错误?可能是堆栈跟踪?不,服务器发送的消息,管理员/客户端打印出服务器发送的内容。。。但是管理员/客户机无法从控制台输入选择,以发送回服务器。嗯,如果我与管理员一起使用另一个线程,会更好吗?或者可能使用hasNextLine()以外的其他内容读取服务器输入?使用线程。因为在服务器发送新行之前,您无法判断服务器是否会发送新行(Java程序在预测未来方面非常糟糕)。而且不仅仅是扫描仪