为什么我不能多次运行这个简单的服务器 - 客户端应用程序的客户端?

时间:2015-05-05 21:25:53

标签: java client-server

这是服务器端的代码:

public class EchoServer {

    public static void main(String[] args) {

        int port = 8080;
        try {
            ServerSocket server = new ServerSocket(port);
            Socket cliSocket = server.accept();

            Scanner in = new Scanner(cliSocket.getInputStream());

            PrintWriter write = new PrintWriter(cliSocket.getOutputStream(),true);
            String message;
            while((message=in.nextLine()) != null){
                write.println(message+" added");
            }

            write.close();

        } catch (IOException e) {

            e.printStackTrace();
        }


    }


}

这是客户端:

public class EchoClient {


 public static void main(String[] args) {

  String ip = "localhost";
  int port = 8080;

  try {
    Socket client = new Socket(ip, port);
    PrintWriter write = new PrintWriter(client.getOutputStream(), true);

    Scanner in = new Scanner(client.getInputStream());

    Scanner read = new Scanner(System.in);
    String input;
    while((input=read.nextLine()) != null){
        write.println(input);
        System.out.println("sent by server:" + in.nextLine());

    }

    write.close();
    in.close();
    read.close();
    client.close();


} catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}



}

}

现在当我运行服务器然后运行客户端时,它可以运行。但是如果关闭客户端应用程序,并且我再次运行它,服务器将不允许连接。

在这种情况下解决方案是什么?

2 个答案:

答案 0 :(得分:1)

您的服务器程序只接受一个客户端连接,并在处理连接后退出。

如果您希望它重复接受客户端连接,您需要使用defproject

中的代码循环

答案 1 :(得分:0)

最简单的解决方案是每次接受连接时,都会启动一个新线程来处理客户端。这将允许您处理任意数量的客户端,并且还处理一般的TCP问题,例如在客户端被杀时被卡住的套接字。

这样的事情:

myApp.directive('integer', function() {
    return {
        require: 'ngModel',
        link: function(scope, el, attr, ctrl){
            ctrl.$parsers.unshift(function(viewValue){
                return parseInt(viewValue, 10);
            });
        }
    };
});