5

HttpUrlConnection 线程安全吗?即,如果我有一个连接到服务器的 HttpConnection 实例,并且该实例被不同的线程使用(例如尝试同时发送 POST),HttpUrlConnection 将如何处理这种情况?a)他们会串行发送 POST,还是 b)第一个线程发送 POST,获取响应,然后第二个线程将发送 POST?如果他们串行发送 POST,这意味着多个活动 POST 到同一个 tcp 连接。这是允许的吗?它可以由服务器处理吗?

谢谢

4

2 回答 2

13

它不是线程安全的。

您不应该缓存/共享连接。只需为每个请求创建一个新连接。创建新连接肯定有一点开销,但它非常小,你不应该担心它。

HTTP的精神实际上是无连接的。从语义上讲,客户端和服务器之间没有连接。客户端发送请求,服务器返回响应,仅此而已。

虽然今天 HTTP 确实是在 TCP 之上定义的,这是一个连接协议,并且 HTTP 可能使用长寿命的 TCP 连接来处理多个请求/响应,但这不是 HTTP 的本质。

由于交换的请求-响应可以在大多数网络协议之上实现,最初 HTTP 允许指定底层协议的可能性。我们可以想象通过电子邮件进行 http 请求/响应交换 - http:/smtp/www.example.com; 也许 RMI - http:/rmi/www.example.com; 默认是 TCP,所以http://真的意味着http:/tcp/

今天,只使用了 TCP,剩下的就是这个奇怪的双斜线分隔符。但这提醒一下,HTTP 对 TCP 的依赖是相当偶然的。

于 2010-07-17T20:00:29.367 回答
5

它没有说它是否在文档中。查看代码后(http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/net/sun/net/www/protocol/http/HttpURLConnection.java.htm)看起来 getInputStream 和 getOutputStream 是同步的。我确实担心的是,如果您有一个获取输入流的线程,同时您有另一个获取输出流的线程,则您的信号可能会交叉。inputStream 和 outputStream 是可能不应该跨线程共享的实例变量。

如果我是你,我会实现一个队列,允许你将消息发布到队列,然后一次将它们发布到服务器。当请求返回时,您只需调用回调。这将确保在响应返回之前未发送请求。

于 2010-07-18T01:34:33.490 回答