网页无限期地等待Web服务器响应

时间:2018-01-13 11:17:57

标签: java sockets post http-1.1 persistent-connection

我正在借助JDK提供的ServerSocket和Socket API编写一个简单的Java服务器。我有一个WebServer类('Thread'),它有一个

ServerSocket serverSocket = new ServerSocket(8086);

并阻止

Socket clientSocket = serverSocket.accept();

我有一个带有WebServer类的固定线程池执行器。当客户端连接并解除对.accept()调用的阻塞时,我创建了一个Connection类的实例(一个'Runnable'并由我实现来处理请求并响应客户端)。此实例将传递给固定线程池执行程序以执行。 WebServer类中的循环如下所示:

while(!Thread.interruped()) {
    try {
        final Socket client = this.serverSocket.accept();
        logger.debug("WebServer: Incoming request!!");
        final Connection connection = new Connection(client, this.rootPath);
        this.threadPool.execute(connection);
    } catch (IOException e) {
        logger.error("Error listening on " + this.port + " because " + e.getMessage());
    }
}

我在html中有一个简单的表单,可以将'POST'数据发送到服务器。表单html如下所示:

<html>
<body>
<h1>Blog post</h1>

<form id="blogPost" method="post" action="/POSTrequest">
    Title: <input type="text" name="title"></input><br /> 
    Text: <input type="text" name="text"></input><br /> 
    <input type="submit" value="Submit" name="Submit"> 
</form> 
</body>
</html>

考虑到它是HTTP / 1.1(保持活动行为),我已经保证,并且我必须在此应用程序中实现,现在有2个问题:

1。)每次我从网络浏览器发送GET请求以获取上述html,提交表单(并实际发布数据),我需要点击两次(这个不是双击)。在第一次单击时,请求标头为空(当我逐行解析请求时)。 在第二次单击按钮时,数据发布良好,可以在服务器端进行良好处理。 所有后续点击(直到我刷新页面)都只需点击一下即可。

2。)在我在第1点中提到的所有点击中,网页在服务器上无限期地等待(在我的情况下为localhost)以获得响应,而据我所知,我写了并刷新了相应的响应(其他标题200 OK,包括Connection:keep-alive和Content-Length中的正确长度)。

3。)另外我观察到,在回复POST请求时,即使在头部连接:保持活动状态,而不必关闭套接字或套接字的输入/输出流之后,还有另一个请求来自客户端(网页)进行连接(可能是HTTP / 1.1的特性以建立持久连接)。为什么会发生这种情况,既没有关闭套接字也没有关闭流,也没有丢失保持活动标头。

很抱歉在这篇文章中提出了多个问题。请提出您的问题,因为可能需要更多详细信息。谢谢你的帮助!

使用HTTP / 1.1进行Java套接字编程的任何有用链接?

1 个答案:

答案 0 :(得分:0)

不确定,这是如何工作的,但是通过在html中的表单标记中添加 enctype 属性,一切似乎都很好。

    <form id="blogPost" method="post" action="/POSTrequest" enctype="multipart/form-data">
        ... (same as in the question)
    </form>