Cra*_*lus 4 .net java multithreading httpurlconnection
HttpUrlConnection线程安全吗?即如果我有一个连接到服务器的HttpConnection实例并且该实例被不同的线程使用(egtry同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们是否会串行发送POST,或者b)第一个线程发送POST,获得响应,然后第二个线程将发送POST?如果他们以串行方式发送POST,则意味着对同一tcp连接的多个活动POST.这是允许的吗?可以由服务器处理吗?
谢谢
irr*_*ble 13
它不是线程安全的.
你不应该缓存/共享连接.只需为每个请求创建一个新连接.创建新连接肯定有一点开销,但它非常小,你不应该担心它.
HTTP 的精神实际上是无连接的.从语义上讲,客户端和服务器之间没有连接.客户端发送请求,服务器发回响应,即全部.
虽然今天HTTP确实是在TCP之上定义的,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 是可能不应跨线程共享的实例变量。
如果我是你,我会实现一个队列,允许你将消息发布到队列,然后一次一个地将它们发布到服务器。当请求返回时,您只需调用一个回调。这将确保在响应返回之前不会发送请求。