Java重新打开新连接的ServerSocket

Java重新打开新连接的ServerSocket,java,multithreading,sockets,loops,Java,Multithreading,Sockets,Loops,我有以下java echo服务器的代码,该服务器侦听传入的请求并回复发送的文本 public class EchoServer { int port; ServerSocket server; Socket client; BufferedWriter bw; BufferedReader br; EchoServer() throws IOException{ int port = 1234; while(tru

我有以下java echo服务器的代码,该服务器侦听传入的请求并回复发送的文本

public class EchoServer {
    int port;
    ServerSocket server;
    Socket client;
    BufferedWriter bw;
    BufferedReader br;

    EchoServer() throws IOException{
        int port = 1234;
        while(true){
            server = new ServerSocket(port);
            client = server.accept();
            bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            br = new BufferedReader(new InputStreamReader(client.getInputStream()));

            bw.write(br.readLine());
            bw.newLine();
            bw.flush();

            bw.close();
            br.close();
            client.close();
            server.close();
        }
    }

    public static void main(String[] args)throws IOException{
        new EchoServer();
    }
}
但我认为这是无效的,因为每个对象都会在循环中重新创建。如果我将循环修改为以下内容

while(true){
        server = new ServerSocket(port);
        client = server.accept();
        bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        br = new BufferedReader(new InputStreamReader(client.getInputStream()));

        bw.write(br.readLine());
        bw.newLine();
        bw.flush();
}

bw.close();
br.close();
client.close();
server.close();
我可以处理很多请求,但只能在客户端处理。 我可以做什么来获得以下行为:

  • 处理无限量的请求
  • 按顺序处理每个请求,一次只处理一个请求
  • 无需创建对象或关闭流/套接字
  • 无螺纹
甚至可以在没有线程的情况下实现这种行为,因为我不希望事情变得不必要的复杂。如果不可能,我如何使用线程实现它


提前感谢

除非您转向非阻塞NIO,否则您的目标会发生冲突。要修复此当前代码,您需要:

  • 新服务器套接字(端口)
    行移动到
    while
    循环之前,并将close to移动到循环之后
  • 为每个接受的套接字启动一个新线程,以处理其I/O

  • 这就是大多数Java服务器的工作方式。

    服务器套接字的整个要点是,您不必每次都创建它。将创建(和关闭)从循环中移除。除其他外,这将导致同时发送连接请求的客户端排队,并在下次调用
    server.accept()
    时提供服务。如果关闭每个循环上的
    ServerSocket
    ,则挂起的客户端队列将丢失


    另一方面,如果您对创建对象非常反感,那么您可能不应该使用Java或任何其他OOPL,因为它们的API不断地创建和销毁对象。当您连接两个字符串时,您认为它们中的许多会发生什么?是什么让你相信对象创建是如此低效?如果您在OOPL中开发程序时考虑到了这些想法,那么从长远来看,这些程序将很难维护、脆弱,而且可能效率较低。

    我认为这是一种误解,我对创建和销毁对象没有问题,但在不需要时这样做,在我的代码中,serversocket不需要在每次创建循环时都重新创建run@danielr1996如果你知道这是不必要的,你为什么要这样做?我在发布答案时不知道,但因为我知道答案通常都不需要并发处理请求。见第二点。他的问题似乎是缺少连续或至少在每次连接后关闭
    ServerSocket
    的并发连接建立产品。@MarioRossi OP需要“无限量的请求”和“按顺序处理每个请求,一次只处理一个请求”。这包括来自单个客户端的多个请求。如果没有多路复用I/O或阻塞模式中的线程,这是不可能的。