从套接字读取数据后等待超时停止套接字

时间:2016-09-09 06:12:32

标签: java sockets http network-programming socket-timeout-exception

我正在尝试使用tcp套接字创建一个java http服务器。 HTTP 1.1具有超时值,该值将使连接保持持久性并等待来自客户端的可能数据。我正在尝试使用:clientSocket.setSoTimeout()在我的程序中实现此计时器。即使这有助于使连接保持打开一段时间,但它会在允许读取下一个请求之前等待确切的时间。

例如:

如果超时设置为5秒,

读取请求1。然后插座挂起并等待5秒钟结束 请求2被读取。套接字等待直到5秒再次启动。

如果我的超时设置为大值,则证明这是一个问题。这不应该是这种情况,因为一旦收到请求就应该处理请求,并且只有在整个指定的持续时间内没有收到数据时,超时才会到期。

有人可以告诉我如何解决这个问题吗?

编辑:

对于遇到类似问题的人,这是我的解决方案:

由于客户端在接收所有数据之前等待超时,我猜测客户端不知道已收到服务器的所有数据。因此,我在HTTP响应数据包中添加了一个内容长度字段。现在,我的客户端在收到数据后不再挂起。 setSoTimeout确实按照规定工作!

2 个答案:

答案 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()已经做过的事情。

你的问题是建立在谬论之上的。