我正在尝试使用tcp套接字创建一个java http服务器。 HTTP 1.1具有超时值,该值将使连接保持持久性并等待来自客户端的可能数据。我正在尝试使用:clientSocket.setSoTimeout()
在我的程序中实现此计时器。即使这有助于使连接保持打开一段时间,但它会在允许读取下一个请求之前等待确切的时间。
例如:
如果超时设置为5秒,
读取请求1。然后插座挂起并等待5秒钟结束 请求2被读取。套接字等待直到5秒再次启动。
如果我的超时设置为大值,则证明这是一个问题。这不应该是这种情况,因为一旦收到请求就应该处理请求,并且只有在整个指定的持续时间内没有收到数据时,超时才会到期。
有人可以告诉我如何解决这个问题吗?
编辑:
对于遇到类似问题的人,这是我的解决方案:
由于客户端在接收所有数据之前等待超时,我猜测客户端不知道已收到服务器的所有数据。因此,我在HTTP响应数据包中添加了一个内容长度字段。现在,我的客户端在收到数据后不再挂起。 setSoTimeout确实按照规定工作!
答案 0 :(得分:0)
好的,当你收到连接时,请开始这样的新主题:
class ClientService extends Thread {
private final Socket clientSocket;
public ClientService(Socket clientSocket) {
this.clientSocket=clientSocket;
}
public void run() {
// do your work with the Socket clientSocket here
}
}
这就是您的服务器代码应如下所示:
while (true) {
Socket clientSocket = server.accept();
new ClientService(clientSocket).start();
}
它允许您处理响应而无需等待,直到超时为止。
答案 1 :(得分:0)
HTTP 1.1具有超时值,该值将使连接保持持久性并等待来自客户端的可能数据。
不是真的。它有一个连接:keep-alive设置,这是默认行为,它允许端点关闭一段闲置后未使用的连接,但它本身没有超时属性。
我正在尝试使用以下命令在我的程序中实现此计时器:clientSocket.setSoTimeout()。
这与HTTP没有任何关系。这是套接字读取超时。
即使这有助于让连接保持打开状态一段时间,但它会在允许读取下一个请求之前等待一段确切的时间。
不,不会。如果在超时期限内没有数据到达,它将导致读取方法抛出SocketTimeoutException
。没别了。
例如:
如果超时设置为5秒,
读取请求1。然后套接字挂起并等待5秒钟结束。
不,不。
读取请求2。套接字等待直到5秒再次启动。
不,不。你已经完成了这一切。这是幻想。
如果我的超时设置为大值,则证明是一个问题。
任何超时值无论是大还是小都不是问题,因为它根本不会发生。
这不应该是这种情况,因为一旦收到请求就应该处理请求,并且只有在整个指定的持续时间内没有收到数据时,超时才会到期。
这正是Socket.setSoTimeout()
已经做过的事情。
你的问题是建立在谬论之上的。