无法在 Java 中使用 Serversocket 多次发送请求

Cannot send request for more than once with Serversocket in Java

我在 Netbeans 中有一个简单的客户端-服务器应用程序,它向服务器发送登录请求并听取服务器的响应。

我在客户端的构造函数中声明了这些代码:

    try {
        socket = new Socket("localhost", 12345);
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());
    }catch (Exception e) {
        e.printStackTrace();
    }

点击str按钮时的请求发送者是登录信息:

public void request_login(String str) {
    try {

        this.oos.writeInt(1);
        this.oos.writeUTF(str);
        this.oos.flush();
        System.out.println("CLIENT: Sent!");

        int responseCode = this.ois.readInt();
        if (responseCode == Protocol.OK) {
            //OK handler
        }else {
        //Fail handler
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NullPointerException ee) {
                ee.printStackTrace();
            }

}

这是我的服务器:

public ServerATM() {
    try {
                this.serversocket = new ServerSocket(12345);
                System.out.println("Server is listening!");

                for(;;){
                        Socket socket = this.serversocket.accept();
                        Thread t = new ClientThread(socket);
                        t.start();
                }
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }

}

ClientThread class:

  public ClientThread(Socket socket) {
    this.socket = socket;
    try {
                this.ois = new ObjectInputStream(socket.getInputStream());
                this.oos = new ObjectOutputStream(socket.getOutputStream());
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
}

private void processThread() {
    try {
        int requestCode = this.ois.readInt();
        switch(requestCode) {
            case 1:
                String request = ois.ReadUTF();
                // Handle the code with the request.
                //Then return the result for client
                oos.writeInt(5);
                oos.flush();
                break;
            case 2:
                break;
        }
    } catch (IOException ex) {
        Logger.getLogger(ClientThread.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void run(){
    processThread();
}

代码在第一次点击时运行良好。但是当我更改输入字符串并再次单击时,代码就会挂起。 processThread 仅在第一次点击时调用一次,第二次点击不会调用它,因此不会执行我的代码。

看起来在发送请求时,它会在服务器中创建一个新线程,但在这种情况下它已经创建,因此不会再次 运行。无论如何我可以发送多次请求并且服务器会全部监听?

谢谢

使用 while 循环在 ClientThread 的方法 run() 中调用 processThread() 方法。

public void run(){
    while(true) processThread();
}

希望这会有所帮助..