httpurlconnection线程安全

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

谢谢

它没有说明是否在文档中。 查看代码后( 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是可能不应在Threads之间共享的实例变量。

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

它不是线程安全的。

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

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的依赖是相当偶然的。