【问题标题】:Java reusing socketJava 重用套接字
【发布时间】:2013-04-17 16:57:43
【问题描述】:

我有一个通过 HTTP 到服务的套接字连接。该服务仅支持 HTTP/1.0,默认情况下在发送响应时关闭连接。此版本的协议中添加了一个参数 - Connection: Keep-alive - 使其成为可能。该标准定义服务也应该将此参数附加到标头。这不会发生,响应标头不包含它。

当我从套接字获取 inputStream 时,它不支持标记。那么,我是否可以安全地假设我将无法重用同一个连接来发送/接收多个请求/响应?

更新 我无法控制服务,我手动构建请求。

Socket socket = new Socket("server.com", 11111);

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

writer.write("POST HTTP/1.0\r\n");
writer.write("Host: " + socket.getInetAddress().getHostName() + "\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("Content-Type: text/xml; charset=\"utf-8\"\r\n");
writer.write("Connection: Keep-alive\r\n");
writer.write("\r\n");

writer.write(xmldata);
writer.flush();

List<String> lines = IOUtils.readLines(socket.getInputStream());

【问题讨论】:

  • 你能给我们看一些代码吗?您是否使用一些库来构建您的 http 请求?
  • 你控制什么?客户端或服务器或两者兼而有之?如果您对服务器没有影响并且它关闭了连接,则您无能为力,只需创建新的套接字..

标签: java sockets http stream


【解决方案1】:

HTTP 1.0 标准 (RFC 1945) 实际上并没有定义任何这样的东西。这是一个后期添加的功能,服务器没有义务支持它。

【讨论】:

  • @locke 正如 EJP 所写,您必须处理不支持此功能的服务器。但除此之外,无论如何,您应该已经发现套接字在任何给定时间关闭的可能性。你同意吗,EJP?
  • @Fildor 当然可以。服务器可以随时关闭连接,即使在 HTTP 1.1 中也是如此。如果它拒绝与Connection: Keep-alive合作,同上。
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多