使用Java中的Serversocket不能多次发送请求

时间:2015-04-28 05:43:26

标签: java request client-server

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

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

    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类:

  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仅在第一次点击时调用一次,第二次点击不会调用它,因此它不会执行我的代码。

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

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

希望这会有所帮助..