Java重新打开新连接的ServerSocket
我有以下java echo服务器的代码,该服务器侦听传入的请求并回复发送的文本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
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移动到循环之后这就是大多数Java服务器的工作方式。服务器套接字的整个要点是,您不必每次都创建它。将创建(和关闭)从循环中移除。除其他外,这将导致同时发送连接请求的客户端排队,并在下次调用
server.accept()
时提供服务。如果关闭每个循环上的ServerSocket
,则挂起的客户端队列将丢失
另一方面,如果您对创建对象非常反感,那么您可能不应该使用Java或任何其他OOPL,因为它们的API不断地创建和销毁对象。当您连接两个字符串时,您认为它们中的许多会发生什么?是什么让你相信对象创建是如此低效?如果您在OOPL中开发程序时考虑到了这些想法,那么从长远来看,这些程序将很难维护、脆弱,而且可能效率较低。我认为这是一种误解,我对创建和销毁对象没有问题,但在不需要时这样做,在我的代码中,serversocket不需要在每次创建循环时都重新创建run@danielr1996如果你知道这是不必要的,你为什么要这样做?我在发布答案时不知道,但因为我知道答案通常都不需要并发处理请求。见第二点。他的问题似乎是缺少连续或至少在每次连接后关闭
ServerSocket
的并发连接建立产品。@MarioRossi OP需要“无限量的请求”和“按顺序处理每个请求,一次只处理一个请求”。这包括来自单个客户端的多个请求。如果没有多路复用I/O或阻塞模式中的线程,这是不可能的。