gpt4 book ai didi

Java - ServerSocket accept() 方法在 while(true) 循环中重复

转载 作者:行者123 更新时间:2023-11-30 11:24:52 25 4
gpt4 key购买 nike

希望有人可以阐明这一点,并提供解决方法,或者阐明我在这里缺少的一些方法。

只是想尝试创建一个非常简单的 Web 服务器。

到目前为止我有:

public class SocketTest {

public static void main(String[] args) throws IOException {

ServerSocket sock = new ServerSocket(9876);

while(true) {

System.out.println("Before");
Socket conn = sock.accept();
System.out.println("After");

conn.close();

}
}
}

然后,一旦项目运行,输出窗口显示:

Before

这是我所期望的,但是当我输入时:

127.0.0.1:9876

进入网络浏览器,我最终得到:

Before
After
Before
After
Before
After
Before

显示。因此浏览器显然多次连接到该端口,但只有第一次连接在其页眉中包含任何信息。


在撰写本文时,我决定更进一步地进行实验,并提出:

public class SocketTest {

public static void main(String[] args) throws IOException {

ServerSocket sock = new ServerSocket(9876);

while(true) {

System.out.println("Before");
Socket conn = sock.accept();
System.out.println("After");

Scanner sc = new Scanner(conn.getInputStream());

System.out.println("BEFORE if...");

if (sc.hasNext()) {

System.out.println("INSIDE if...");

String[] cnr = sc.nextLine().split("\\s+");
System.out.println("Command: " + cnr[0] + " - URL: " + cnr[1]);

} else {

System.out.println("INSIDE ELSE!");

}

System.out.println("Closing...");

conn.close();

System.out.println("Closed!");
}
}
}

如果您编译并运行此代码,您会注意到,在第一次打开套接字上的页面时,您会重复打开套接字,但它似乎也在以下行挂起大约 10 秒:

if (sc.hasNext()) {

就好像它在一段时间内观察 InputStream(),看看它是否包含任何信息......?

此外,如果我快速连续发送两个实际页面(或只是刷新页面),它会立即通过。

任何人都可以阐明这一点吗?

我如何才能消除对永远不会实现的 InputStream() 的等待,或者我如何才能让它忽略幻影 套接字。

即使是关于导致异常的原因的一点背景知识也会很棒!

最佳答案

接受线程永远不应该等待套接字的输入,它应该将数据交换委托(delegate)给一个单独的线程并立即返回到 ServerSocket.accept() 的执行,就像 this example 末尾描述的那样。 .对于高负载的服务器(数千个并发连接),该线程会消耗太多内存,因此可以使用异步 IO。

关于Java - ServerSocket accept() 方法在 while(true) 循环中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com