【发布时间】:2017-01-17 05:04:55
【问题描述】:
我正在尝试使用 tcp 套接字创建一个 java http 服务器。 HTTP 1.1 有一个超时值,该值将使连接保持持久并等待一小段时间以获取来自客户端的可能数据。我正在尝试使用:clientSocket.setSoTimeout() 在我的程序中实现这个计时器。尽管这有助于使连接保持打开一段时间,但它会在允许读取下一个请求之前等待确切的时间。
例如:
如果超时设置为 5 秒,
请求 1 被读取。然后套接字挂起,等待 5 秒结束。
读取请求 2。套接字等待 5 秒后再次启动。
如果我的超时设置为较大的值,这被证明是一个问题。不应出现这种情况,因为一旦收到请求就应该对其进行处理,并且只有在指定的持续时间内没有收到任何数据时才会超时。
谁能告诉我如何解决这个问题?
编辑:
对于面临类似问题的人,这是我的解决方案:
由于客户端一直等到超时才接收到所有数据,所以我猜测客户端并不知道服务器的所有数据都已接收完毕。因此,我在 HTTP 响应数据包中添加了一个内容长度字段。现在,我的客户端在收到数据后不再挂起。 setSoTimeout 确实按说明工作!
【问题讨论】:
-
你能展示一些你的代码吗?也许是接受客户的部分?
-
我只用了一行来接受客户端:
client = server.accept();放在while(true)循环中不断监听连接。 -
当然可以,但是接下来会发生什么?我怀疑,您错过了将处理客户端的任务传递给另一个线程,但是如果没有看到任何代码,就很难说出确切的问题出在哪里。这就是他们在帮助中心谈论“最小、完整和可验证的示例”的原因。 stackoverflow.com/help/mcve
-
我的服务器没有使用任何多线程。是否可以在没有多线程的情况下进行超时?
-
'持久连接'并不意味着'服务器将通过相同的连接发送响应'。在 HTTP 中总是如此。这意味着客户端可以通过同一连接发送更多请求。 HTTP 不“做”任何事情。实现就是这样做的。你正在实施它:你去做。您需要比目前在此项目中获得的任何地方更好的 HTTP 知识。
标签: java sockets http network-programming socket-timeout-exception