Httpsocketconnectionn和socket通信有什么区别

1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读5079人阅读
最近在处理百度知道接口的问题时,遇到了下面的问题。在本机测试一直没有问题,因为测试的时间太短。而放到服务器上面就出现了下面的异常。而且是一直的出现。google 一下,原来是http连接出现了异常没有被关闭导致。写下来备查!
java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:397)
at java.net.Socket.&init&(Socket.java:371)
at java.net.Socket.&init&(Socket.java:249)
at mons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80)
at mons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122)
at mons.httpclient.HttpConnection.open(HttpConnection.java:707)
at mons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at mons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at mons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at mons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at com.thhc.mylegist.baidu.BaiDuHttpFactory.getQuestionList(BaiDuHttpFactory.java:284)
at com.thhc.mylegist.baidu.BaiDuTask.run(BaiDuTask.java:21)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
下面是转载的内容:
1.HttpClient client = new HttpClient();
2.HttpMethod method = new GetMethod("http://www.apache.org");
client.executeMethod(method);
byte[] responseBody =
responseBody = method.getResponseBody();
9.} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
12.} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
15.}finally{
method.releaseConnection();
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod("http://www.apache.org");
client.executeMethod(method);
byte[] responseBody =
responseBody = method.getResponseBody();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
method.releaseConnection();
大部分人使用HttpClient都是使用类似上面的事例代码,包括Apache官方的例子也是如此。最近我在使用HttpClient是发现一次循环发送大量请求到服务器会导致APACHE服务器的链接被占满,后续的请求便排队等待。
我服务器端APACHE的配置
1.Timeout 30
2.KeepAlive On
#表示服务器端不会主动关闭链接
3.MaxKeepAliveRequests 100
4.KeepAliveTimeout 180
Timeout 30
KeepAlive On
#表示服务器端不会主动关闭链接
MaxKeepAliveRequests 100
KeepAliveTimeout 180
因此这样的配置就会导致每个链接至少要过180S才会被释放,这样在大量请求访问时就必然会造成链接被占满,请求等待的情况。
在通过DEBUH后发现HttpClient在method.releaseConnection()后并没有把链接关闭,这个方法只是将链接返回给connection manager。如果使用HttpClient client = new HttpClient()实例化一个HttpClient connection manager默认实现是使用SimpleHttpConnectionManager。SimpleHttpConnectionManager有个构造函数如下
2. * The connection manager created with this constructor will try to keep the
3. * connection open (alive) between consecutive requests if the alwaysClose
4. * parameter is set to &tt&false&/tt&. Otherwise the connection manager will
5. * always close connections upon release.
7. * @param alwaysClose if set &tt&true&/tt&, the connection manager will always
close connections upon release.
10.public SimpleHttpConnectionManager(boolean alwaysClose) {
this.alwaysClose = alwaysC
* The connection manager created with this constructor will try to keep the
* connection open (alive) between consecutive requests if the alwaysClose
* parameter is set to &tt&false&/tt&. Otherwise the connection manager will
* always close connections upon release.
* @param alwaysClose if set &tt&true&/tt&, the connection manager will always
close connections upon release.
public SimpleHttpConnectionManager(boolean alwaysClose) {
this.alwaysClose = alwaysC
看方法注释我们就可以看到如果alwaysClose设为true在链接释放之后connection manager 就会关闭链。在我们HttpClient client = new HttpClient()这样实例化一个client时connection manager是这样被实例化的
1.this.httpConnectionManager = new SimpleHttpConnectionManager();
this.httpConnectionManager = new SimpleHttpConnectionManager();
因此alwaysClose默认是false,connection是不会被主动关闭的,因此我们就有了一个客户端关闭链接的方法。
把事例代码中的第一行实例化代码改为如下即可,在method.releaseConnection();之后connection manager会关闭connection 。
1.HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) );
HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) );
实例化代码使用:HttpClient client = new HttpClient();
在method.releaseConnection();之后加上
1.((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();
((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();
shutdown源代码很简单,看了一目了然
1.public void shutdown() {
httpConnection.close();
public void shutdown() {
httpConnection.close();
实例化代码使用:HttpClient client = new HttpClient();
在method.releaseConnection();之后加上
client.getHttpConnectionManager().closeIdleConnections(0);此方法源码代码如下:
1.public void closeIdleConnections(long idleTimeout) {
long maxIdleTime = System.currentTimeMillis() - idleT
if (idleStartTime &= maxIdleTime) {
httpConnection.close();
public void closeIdleConnections(long idleTimeout) {
long maxIdleTime = System.currentTimeMillis() - idleT
if (idleStartTime &= maxIdleTime) {
httpConnection.close();
将idleTimeout设为0可以确保链接被关闭。
以上这三种方法都是有客户端主动关闭TCP链接的方法。下面再介绍由服务器端自动关闭链接的方法。
代码实现很简单,所有代码就和最上面的事例代码一样。只需要在HttpMethod method = new GetMethod("http://www.apache.org");加上一行HTTP头的设置即可
1.method.setRequestHeader("Connection", "close");
method.setRequestHeader("Connection", "close");
看一下HTTP协议中关于这个属性的定义:
HTTP/1.1 defines the "close" connection option for the sender to signal that the connection will be closed after completion of the response. For example,
Connection: close
现在再说一下客户端关闭链接和服务器端关闭链接的区别。如果采用客户端关闭链接的方法,在客户端的机器上使用netstat &an命令会看到很多TIME_WAIT的TCP链接。如果服务器端主动关闭链接这中情况就出现在服务器端。
参考WIKI上的说明http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions
The TIME_WAIT state is a protection mechanism in TCP. The side that closes a socket connection orderly will keep the connection in state TIME_WAIT for some time, typically between 1 and 4 minutes.
TIME_WAIT的状态会出现在主动关闭链接的这一端。TCP协议中TIME_WAIT状态主要是为了保证数据的完整传输。具体可以参考此文档:
http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7
另外强调一下使用上面这些方法关闭链接是在我们的应用中明确知道不需要重用链接时可以主动关闭链接来释放资源。如果你的应用是需要重用链接的话就没必要这么做,使用原有的链接还可以提供性能。
8 楼 javatar
官方文档有建议使用空闲连接检查线程:
1.import mons.httpclient.util.IdleConnectionTimeoutT
2.// 创建线程
3.IdleConnectionTimeoutThread thread = new IdleConnectionTimeoutThread();
4.// 注册连接管理器
5.thread.addConnectionManager(httpClient.getHttpConnectionManager());
6.// 启动线程
7.thread.start();
8.// 在最后,关闭线程
9.thread.shutdown();
import mons.httpclient.util.IdleConnectionTimeoutT
// 创建线程
IdleConnectionTimeoutThread thread = new IdleConnectionTimeoutThread();
// 注册连接管理器
thread.addConnectionManager(httpClient.getHttpConnectionManager());
// 启动线程
thread.start();
// 在最后,关闭线程
thread.shutdown();
7 楼 sdh-29
楼上的说法是对的, 但是, 性能来说, 是不合适的.
首先, 我想问你, 既然是轮询, 为什么HttpURLConnection要每次创建.
既然是个持续的过程, 就不应该每次HttpURLConnection对象重新创建, 你应该重复使用这个对象. HttpURLConnection会持有连接的, 如果断开, 我记得他会去尝试连接.
6 楼 SeanHe
但使用netstat发现很多TIME_WAIT,时间长点后会出现端口都被占用的状况 address already in use :connect,使用HttpURLConnection.disconnect()也没有效果。
如果你是应为客户端出现很多的TIME_WAIT造成端口占用,你不妨试一下&方法四&在HTTP请求头上设置"Connection", "close"这样服务器会来主动关闭链接,这样就不会在客户端产生很多的TIME_WAIT
我是google到这里的。。。
您对HttpClient 的关闭分析的很透彻
请教HttpURLConnection和URLConnection怎么关闭链接?
我需要轮询一个网址,但使用netstat发现很多TIME_WAIT,时间长点后会出现端口都被占用的状况 address already in use :connect,使用HttpURLConnection.disconnect()也没有效果。
4 楼 fly_ever
另外强调一下使用上面这些方法关闭链接是在我们的应用中明确知道不需要重用链接时可以主动关闭链接来释放资源。如果你的应用是需要重用链接的话就没必要这么做,使用原有的链接还可以提供性能。
正如你所说,实际上是只有并发量很高的时候才会发生链接占满的情况。
而如果没有这么高的并发量,我们没必要去实现代码来关闭连接。
因为我们在代码中实现主动关闭的功能的同时,也丧失了性能上的优势。
因此,我觉得遇到这种情况,应该把设置中的keepAliveTimeout调低,显得更好一些。
1.1. Timeout 30
2.2. KeepAlive On
#表示服务器端不会主动关闭链接
3.3. MaxKeepAliveRequests 100
4.4. KeepAliveTimeout 180
1. Timeout 30
2. KeepAlive On
#表示服务器端不会主动关闭链接
3. MaxKeepAliveRequests 100
4. KeepAliveTimeout 180
不过,这里提供的HttpClient关闭的详细信息,还是很有价值的。
3 楼 jorsef
受用,非常感谢
2 楼 SeanHe
HttpClient client = new HttpClient(); 如果这样进行实例化,默认使用SimpleHttpConnectionManager作为connection manager,SimpleHttpConnectionManager没有连接池,只管理一个连接
1 楼 JavaTestJava
实例化代码使用:HttpClient client = new HttpClient();
在method.releaseConnection();之后加上
((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();
((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();
shutdown源代码很简单,看了一目了然
public void shutdown() {
httpConnection.close();
public void shutdown() {
httpConnection.close();
方法二中的httpConnection.close();这里没有参数么?
httpConnection为默认全局的那个连接?
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:901566次
积分:13307
积分:13307
排名:第304名
原创:405篇
转载:207篇
评论:353条
(1)(3)(3)(1)(3)(3)(1)(1)(6)(7)(4)(5)(7)(9)(4)(2)(10)(10)(15)(5)(7)(4)(14)(10)(5)(1)(2)(3)(2)(2)(1)(1)(10)(9)(1)(9)(7)(2)(28)(1)(18)(13)(4)(11)(10)(5)(2)(9)(2)(5)(7)(6)(5)(19)(39)(40)(43)(35)(21)(10)(19)(5)(15)(34)(17)PHP和SOCKET和HTTP Connection: keep-alive疑惑_php吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:42,943贴子:
PHP和SOCKET和HTTP Connection: keep-alive疑惑收藏
PHP和SOCKET和HTTP Connection: keep-alive疑惑 为什么
$fp = fsockopen("localhost", 80, $errno, $errstr, 3);
楼主既然红旗镇楼,就顶一下,虽然我也不知道。
这是3个不一样的概念,论范围
php&socket&http
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或当前位置: >
> socket跟HTTP通信,GET和POST有什么区别
socket跟HTTP通信,GET和POST有什么区别
wuletter & at
socket和HTTP通信,GET和POST有什么区别?
&&&&就是发送字符串POST&&HTTP/1.1\r\nHost:re&之类玩意,搞不懂这2个是啥区别?&我只知道GET可以下载网页,POST呢?&它们都是干什么用的?
get是为了read
post为了commit/write/修改
看看http协议wuliang_5016 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-下次自动登录
现在的位置:
& 综合 & 正文
进程通信:管道(pipe)和socketpair区别
管道pipe是半双工的,pipe两次才能实现全双工,使得复杂。socketpair直接就可以实现全双工
socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写
详间代码:
一:pipe实现父子进程全双工通信:
#include &stdlib.h&
#include &stdio.h&
int main ()
int fd1[2],fd2[2];
pipe(fd1);
pipe(fd2);
if ( fork() ) {
/* Parent process: echo client */
int val = 0;
close( fd1[0] );
close(fd2[1]);
while ( 1 ) {
sleep( 1 );
printf( "parent Sending data: %d\n", val );
write( fd1[1], &val, sizeof(val) );
read( fd2[0], &val, sizeof(val) );
printf( "parent Data received: %d\n", val );
/* Child process: echo server */
close( fd1[1] );
close(fd2[0]);
while ( 1 ) {
read( fd1[0], &val, sizeof(val) );
printf( "son Data received: %d\n", val );
write( fd2[1], &val, sizeof(val) );
printf( "son send received: %d\n", val );
输出结果:parent Sending data: 1
son Data received: 1
son send received: 2
parent Data received: 2
parent Sending data: 3
son Data received: 3
son send received: 4
parent Data received: 4
一:soketpair实现父子进程全双工通信:
#include &sys/types.h&
#include &sys/socket.h&
#include &stdlib.h&
#include &stdio.h&
int main ()
int fd[2];
int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
if ( r & 0 ) {
perror( "socketpair()" );
exit( 1 );
if ( fork() ) {
/* Parent process: echo client */
int val = 0;
close( fd[1] );
while ( 1 ) {
sleep( 1 );
printf( "parent Sending data: %d\n", val );
write( fd[0], &val, sizeof(val) );
read( fd[0], &val, sizeof(val) );
printf( "parent Data received: %d\n", val );
/* Child process: echo server */
close( fd[0] );
while ( 1 ) {
read( fd[1], &val, sizeof(val) );
printf( "son Data received: %d\n", val );
write( fd[1], &val, sizeof(val) );
printf( "son send received: %d\n", val );
输出结果:parent Sending data: 1
son Data received: 1
son send received: 2
parent Data received: 2
parent Sending data: 3
son Data received: 3
son send received: 4
parent Data received: 4
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 socket通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信