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

Java-ServerSocket accept()方法在while(true)循环中重复,java,sockets,webserver,Java,Sockets,Webserver,希望有人能对这一点有所了解,并提供一个解决方法,或者说明我在这里缺少的一些方法 只是在尝试创建一个非常简单的web服务器 到目前为止,我已经: public class SocketTest { public static void main(String[] args) throws IOException { ServerSocket sock = new ServerSocket(9876); while(true) {

希望有人能对这一点有所了解,并提供一个解决方法,或者说明我在这里缺少的一些方法

只是在尝试创建一个非常简单的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
在web浏览器中,我的最终结果是:

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()的等待,或者如何让它忽略幻影套接字


哪怕是一点引起异常的背景信息都会很好

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

什么是幻影套接字?幻影套接字是指已创建的套接字,但其getInputStream()中没有任何内容。@masterteee:您找到什么了吗??为什么要使用幻影套接字???我理解,但这是一个单线程过程。插座打开了。这根线是用线做的。线程等待查看是否有任何输入通过输入流。线程的流超时(推测)?螺纹和套筒闭合。我想消除超时,因为没有加载任何页面。这对我来说更像是一个练习,可以更好地理解套接字行为,而不必增加多线程的复杂性。由于有多个客户端试图并行访问服务器,因此每个客户端一个线程(+1个线程用于接受连接)的解决方案是最简单和自然的。它可以通过单线程、异步编程和非阻塞IO来解决,但这样的解决方案会更复杂。所以有多个客户端连接到它?这怎么可能?我的web浏览器是连接到套接字的唯一项目。。。除了我自己,任何人都不会实际使用它。来自浏览器的每个请求都会创建单独的连接。