HttpUrlConnection 线程安全吗?即,如果我有一个连接到服务器的 HttpConnection 实例,并且该实例被不同的线程使用(例如尝试同时发送 POST),HttpUrlConnection 将如何处理这种情况?a)他们会串行发送 POST,还是 b)第一个线程发送 POST,获取响应,然后第二个线程将发送 POST?如果他们串行发送 POST,这意味着多个活动 POST 到同一个 tcp 连接。这是允许的吗?它可以由服务器处理吗?
谢谢
HttpUrlConnection 线程安全吗?即,如果我有一个连接到服务器的 HttpConnection 实例,并且该实例被不同的线程使用(例如尝试同时发送 POST),HttpUrlConnection 将如何处理这种情况?a)他们会串行发送 POST,还是 b)第一个线程发送 POST,获取响应,然后第二个线程将发送 POST?如果他们串行发送 POST,这意味着多个活动 POST 到同一个 tcp 连接。这是允许的吗?它可以由服务器处理吗?
谢谢
它不是线程安全的。
您不应该缓存/共享连接。只需为每个请求创建一个新连接。创建新连接肯定有一点开销,但它非常小,你不应该担心它。
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 的依赖是相当偶然的。
它没有说它是否在文档中。查看代码后(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 是可能不应该跨线程共享的实例变量。
如果我是你,我会实现一个队列,允许你将消息发布到队列,然后一次将它们发布到服务器。当请求返回时,您只需调用回调。这将确保在响应返回之前未发送请求。