短链接和长连接

作者:wuxinliulei
链接:https://www.zhihu.com/question/22677800/answer/63806275
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先介绍下短链接和长连接的区别:

短连接
连接->传输数据->关闭连接 比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 具体就是 浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socket.close方法->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。也可以这样说:短连接是指SOCKET连接后,发送接收完数据后马上断开连接。 因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

长连接
连接->传输数据->保持连接 -> 传输数据-> …->直到一方关闭连接,多是客户端关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

HTTP在短链接和长连接上的选择:

HTTP是无状态的 ,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的HTTP1.1 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。 如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。 实现长连接要客户端和服务端都支持长连接。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。 总之,长连接和短连接的选择要视情况而定。

具体网络中的应用的话:

http 1.0一般就指短连接,smtp,pop3,telnet这种就可以认为是长连接。一般的网络游戏应用都是长连接

HttpClient是一个非常流行的Java库,用于发送HTTP请求和接收HTTP响应。在HttpClient中,可以使用链接长连接来与服务器进行通信。 链接是指每次发送请求时都会创建一个新的连接,并在请求完成后关闭连接。这种方式适用于只需要发送少量请求的场景,每次请求都需要重新建立连接,无需维护连接状态。 长连接是指在发送请求后保持连接打开,并可以发送多个请求和接收多个响应。这样可以减少每次通信的开销,提高性能。长连接适用于需要频繁发送请求或保持与服务器的持续通信的场景。 在HttpClient中,默认情况下是使用链接的。如果需要使用长连接,可以通过配置HttpClient的连接管理器来实现。一种常见的方式是使用连接池来管理连接,可以重复利用已经建立的连接,减少连接的创建和销毁开销。 以下是使用HttpClient进行链接长连接的示例代码: 1. 链接: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://example.com/api"); CloseableHttpResponse response = httpClient.execute(httpGet); // 处理响应 response.close(); httpClient.close(); ``` 2. 长连接: ```java PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); connManager.setMaxTotal(100); // 设置最大连接数 connManager.setDefaultMaxPerRoute(20); // 设置每个路由的最大连接数 HttpClient httpClient = HttpClients.custom() .setConnectionManager(connManager) .build(); HttpGet httpGet1 = new HttpGet("http://example.com/api/1"); CloseableHttpResponse response1 = httpClient.execute(httpGet1); // 处理响应 response1.close(); HttpGet httpGet2 = new HttpGet("http://example.com/api/2"); CloseableHttpResponse response2 = httpClient.execute(httpGet2); // 处理响应 response2.close(); // 不需要显式关闭HttpClient,连接管理器会自动管理连接的关闭 ``` 希望这些信息能对你有所帮助!如果你还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值