我正在借助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套接字编程的任何有用链接?
答案 0 :(得分:0)
不确定,这是如何工作的,但是通过在html中的表单标记中添加 enctype 属性,一切似乎都很好。
<form id="blogPost" method="post" action="/POSTrequest" enctype="multipart/form-data">
... (same as in the question)
</form>