HttpUrlConnection线程安全吗?也就是说,如果我有一个连接到服务器的HttpConnection实例,并且这个实例被不同的线程使用(使用e.g.try并发发送POST ),HttpUrlConnection将如何处理这种情况?a)他们会连续发送帖子,还是b)第一个线程发送帖子,获得响应,然后第二个线程发送帖子?如果他们连续发送帖子,这意味着同一tcp连接上有多个活动的帖子。这是允许的吗?它可以由服务器处理吗?
谢谢
发布于 2010-07-18 09:34:33
它没有说明它是否在文档中。在查看代码( 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-18 04:00:29
它不是线程安全的。
你不应该缓存/共享连接。只需为每个请求创建一个新连接即可。当然,在创建新连接时会有一些开销,但这是非常小的开销,您不必担心。
HTTP的精神实际上是无连接的。从语义上讲,客户端和服务器之间没有连接。客户端发送一个请求,服务器返回一个响应,仅此而已。
尽管今天的HTTP确实是在TCP之上定义的,TCP是一种有效连接的协议,并且HTTP可以对多个请求/响应使用长时间的TCP连接,但这不是HTTP的本质。
由于交换的请求-响应可以在大多数网络协议之上实现,因此最初HTTP允许指定底层协议。我们可以想象通过email -http:/smtp/www.example.com进行http请求/响应交换;可能是RMI - http:/rmi/www.example.com;默认值是TCP,所以http://实际上表示http:/tcp/
现在,只使用TCP,剩下的就是这个奇怪的双斜杠分隔符。但这提醒我们,HTTP对TCP的依赖是相当偶然的。
https://stackoverflow.com/questions/3272681
复制相似问题