`

理解HTTP长连接

阅读更多

怎样理解长(短)连结?

 

  客户端向服务器发起连接→客户端提交HTTP请求→服务器返回HTTP回复.  
   
  无论长连接还是短连接 ,以上部分全部
一样的.
   
  如果是长连接,则完成上述步骤后(在还没有timeOut前), 服务器不会马上关闭连接,而是等待客户端重用这个连接并再次发送HTTP请求.
   
  如果是短连接,则服务器响应后关闭连接。客户端要再次发起连接请求后, 才可以另外完成一次请求<-->响应。

 

下面用telnet来描述:

 

 

telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 27 Nov 2009 09:15:31 GMT
Server: Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.5
Connection: close
Content-Type: text/html;charset=ISO-8859-1

Connection closed by foreign host.
 
telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.1
Host:localhost

HTTP/1.1 200 OK
Date: Fri, 27 Nov 2009 09:18:53 GMT
Server: Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.5
Content-Type: text/html;charset=ISO-8859-1

GET / HTTP/1.1
Host: localhsot

HTTP/1.1 200 OK
Date: Fri, 27 Nov 2009 09:19:07 GMT
Server: Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.5
Content-Length: 6626
Content-Type: text/html;charset=ISO-8859-1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>
<h1>Index of /</h1>
<table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Las
t modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"
><hr></th></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="40X/">40X/</a></td><td align="right">11-Ju
n-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="DirectMarketingMail.msg.html">DirectMarketin
gMail.msg.html</a></td><td align="right">11-Jun-2009 10:42  </td><td align="right"> 14K</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="ajax/">ajax/</a></td><td align="right">28-
Sep-2009 12:57  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="apache2-default/">apache2-default/</a></td
><td align="right">21-Nov-2004 04:16  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="crossdomain.xml">crossdomain.xml</a></td>
<td align="right">16-Oct-2009 11:43  </td><td align="right">345 </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="demo/">demo/</a></td><td align="right">11-
Jun-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="demo_en.swf">demo_en.swf</a></td><td alig
n="right">11-Jun-2009 10:42  </td><td align="right">221K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="demo_hk.swf">demo_hk.swf</a></td><td alig
n="right">11-Jun-2009 10:42  </td><td align="right">228K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="demo_zh.swf">demo_zh.swf</a></td><td alig
n="right">11-Jun-2009 10:42  </td><td align="right">238K</td></tr>
<tr><td valign="top"><img src="/icons/image2.gif" alt="[IMG]"></td><td><a href="favicon.ico">favicon.ico</a></td><td align
="right">11-Jun-2009 10:42  </td><td align="right">3.6K</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="kiosk/">kiosk/</a></td><td align="right">1
1-Jun-2009 10:03  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="moviepics/">moviepics/</a></td><td align="
right">11-Jun-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="mpidatafeed.html">mpidatafeed.html</a></td><
td align="right">11-Jun-2009 10:42  </td><td align="right">2.1K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="mpimain.php">mpimain.php</a></td><td alig
n="right">11-Jun-2009 10:42  </td><td align="right">1.2K</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="pagenotfound.html">pagenotfound.html</a></td
><td align="right">11-Jun-2009 10:42  </td><td align="right">4.8K</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="pages.081120/">pages.081120/</a></td><td a            lign="right">11-Jun-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="pages/">pages/</a></td><td align="right">1            1-Jun-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="payment.php">payment.php</a></td><td alig            n="right">11-Jun-2009 10:42  </td><td align="right">1.3K</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="press/">press/</a></td><td align="right">1            1-Jun-2009 10:42  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="report.bak0820/">report.bak0820/</a></td><            td align="right">20-Aug-2009 11:25  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="report/">report/</a></td><td align="right"            >03-Sep-2009 17:41  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="servicenotavailable.html">servicenotavailabl            e.html</a></td><td align="right">11-Jun-2009 10:42  </td><td align="right">4.3K</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="test.htm">test.htm</a></td><td align="right"            >11-Jun-2009 10:42  </td><td align="right">215 </td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="vbox/">vbox/</a></td><td align="right">11-            Jun-2009 10:02  </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="vboxmain.php">vboxmain.php</a></td><td al            ign="right">11-Jun-2009 10:42  </td><td align="right"> 14K</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="vboxsite.txt">vboxsite.txt</a></td><td align            ="right">11-Jun-2009 10:42  </td><td align="right"> 24 </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="vboxurlmap.php">vboxurlmap.php</a></td><t            d align="right">11-Jun-2009 10:42  </td><td align="right">4.5K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="vboxurlmap.php.081016">vboxurlmap.php.081            016</a></td><td align="right">11-Jun-2009 10:42  </td><td align="right">4.3K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="vboxurlmap.php.bak">vboxurlmap.php.bak</a            ></td><td align="right">11-Jun-2009 10:42  </td><td align="right">4.2K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="vboxweb.war">vboxweb.war</a></td><td alig            n="right">11-Jun-2009 10:42  </td><td align="right">819K</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="verify.php">verify.php</a></td><td align=            "right">11-Jun-2009 10:42  </td><td align="right">506 </td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="verifymain.php">verifymain.php</a></td><t            d align="right">11-Jun-2009 10:42  </td><td align="right">864 </td></tr>
<tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.5 Server at localhsot Port 80</address>
</body></html>

 

备注: http 1.0 实现的是短连接, http 1.1实现了长连接 .

 

下面用java来描述http 1.1的长连接.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class MianTest {
	public static void main(String args0[]) throws Exception {
		Socket socket = new Socket("localhost", 8080);
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
		String header1 = "HEAD /  HTTP/1.1\r\nHost:localhost\r\n\r\n";
		String header2 = "GET /  HTTP/1.1\r\nHost: localhost\r\n\r\n";
		
		out.write(header1);
		
		
		out.flush();
		
		StringBuffer sb = new StringBuffer();
			while (true) {
					char c = (char) in.read();
					System.out.print(c);
					if(c=='\r' || c=='\n') {
						sb.append(c);
					}
					else {
						sb.delete(0, sb.length());
					}
					if(sb.toString().equals("\r\n\r\n")) {
						break;
					}
			}
			
			
			
			out.write(header2);
			
			
			out.flush();
			sb.delete(0, sb.length());
			StringBuffer line = new StringBuffer();
			int content_length = 0;
				while (true) {
						char c = (char) in.read();
						System.out.print(c);
						if(c=='\r' || c=='\n') {
							sb.append(c);
						}
						else {
							sb.delete(0, sb.length());
							line.append(c);
						}
						if(sb.toString().equals("\r\n")) {
							String tmp = line.toString();
							int index = tmp.indexOf("Content-Length: ");
							if(index >=0) {
								tmp = tmp.substring(index+"Content-Length: ".length());
								//******************    read Content-Length   *************************
								StringBuffer content_len = new StringBuffer();
								for(int item =0 ; item < tmp.length(); item++) {
									if(tmp.charAt(item) >= '0' && tmp.charAt(item) <= '9') {
										content_len.append(tmp.charAt(item) );
									}
									else if (content_len.length() > 0) {
										break;
									}
								}
								content_length = Integer.parseInt(content_len.toString());
								//******************    read Content-Length   *************************
							}
							line.delete(0, sb.length());
						}
						if(sb.toString().equals("\r\n\r\n")) { //在两个回车换行之后
							if(content_length > 0) {
							  for(int index =0 ; index < content_length ; index++) {
								  c = (char) in.read();
									System.out.print(c);  //提取Content
							  }
								break;  //完成一次Request(GET)
							}
						}
				}
			
			socket.close();
	}
	
	


}
 

 

ok,不用多说了。 注意 http 1.1 使用长连接的时候,需要加入Host:这个Field.

 

另外附加:

Key Differences between HTTP/1.0 and HTTP/1.1

0
0
分享到:
评论

相关推荐

    聊天室(自己实现HTTP长连接)

    ... 【知识点详解】: ...服务器需要维护一个连接池,管理这些长连接,而客户端在发送请求时...通过阅读博主分享的源码和工具使用,我们可以深入理解HTTP长连接的工作原理,并从中学习到如何在实际项目中应用这些技术。

    打造上千万长连接及oracle调优

    1. **HTTP长连接**:理解HTTP长连接的工作机制,如何实现连接复用以减少网络开销,以及在高并发场景下的连接管理和资源调度。 2. **Oracle SQL优化**:学习如何写出高性能的SQL语句,理解Oracle的查询优化器工作...

    Extjs 聊天窗口 -续2 - http长连接的实现

    首先,让我们理解HTTP长连接的基本概念。在HTTP短连接中,每次HTTP请求完成后,服务器和客户端都会关闭TCP连接,为下一个请求重新建立连接。这在高并发场景下会消耗大量资源。相反,HTTP长连接保持TCP连接在多个HTTP...

    Java实现Socket长连接和短连接

    Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short Connection)** 短连接通常用于一次性、非持久性的通信,如HTTP协议就是典型的短连接。在短连接中...

    TCP中长连接短连接

    本文将详细探讨TCP中的长连接和短连接,这两种连接方式在实际应用中的差异和选择。 长连接,也称为持久连接,指的是客户端(Client)与服务器端(Server)在完成连接建立后,保持连接状态不立即断开,以便于进行多...

    php curl 长连接的实现

    在PHP开发中,cURL库是一个非常重要的工具,它用于处理HTTP和其他协议的请求。当涉及到频繁的HTTP通信,如API调用或者内部...开发者在实现长连接时,需要充分理解其工作原理,权衡利弊,并根据实际需求做出最佳选择。

    springboot-keepalive设置测试

    在IT行业中,Spring Boot是一个广泛使用的Java框架,...使用Jodd HttpClient进行HTTP客户端测试,以及理解HTTP长连接在提升系统性能中的作用。通过深入理解和实践这些概念,开发者可以构建更加高效和稳定的微服务架构。

    构建高效的python requests长连接池详解

    本文将深入探讨如何构建高效的`requests`长连接池,这对于处理大量HTTP请求,尤其是涉及到频繁的API调用或者CDN刷新等场景时,能够显著提升性能和减少网络延迟。 首先,了解什么是长连接。在HTTP协议中,长连接...

    Mina实现长连接和短连接实例

    首先,理解长连接和短连接的概念至关重要。在TCP/IP通信中,短连接(Short Connection)是指一次数据传输完成后立即关闭连接,而长连接(Long Connection)则保持连接状态,以便后续的数据交换无需重复进行三次握手...

    C语言长连接服务器Demo(epoll非阻塞)

    通过学习和理解这个C语言的长连接服务器Demo,开发者可以更好地掌握网络编程技术,尤其是如何在高并发场景下构建高效的服务器。这不仅对C语言程序员,对任何从事服务器端开发的工程师都是宝贵的实践经验。

    socket短连接和长连接 多线程的应用

    长连接(Long Connection)则适用于需要频繁交互或保持连接状态的应用,如HTTPS、FTP和TCP保持连接的HTTP/2等。在长连接中,一次连接建立后,可以复用此连接进行多次数据传输,直到一方明确关闭连接。这种方式减少了...

    Socket长连接demo

    通过阅读和理解这个示例,开发者可以学习到如何在Python、Java或其他支持Socket编程的语言中,建立、维护和管理长连接。同时,对于网络编程的基础知识,如TCP/IP协议、套接字API的使用等,也会有更深入的理解。

    php 长连接服务器端

    首先,我们要理解什么是“长连接”。在传统的HTTP协议中,每次请求与响应之间都建立新的TCP连接,这种模式被称为短连接。然而,短连接对于高并发、实时性要求高的场景(如即时通讯)来说,频繁的连接建立和断开会...

    asp.net基于http的长连接项目

    通过学习和分析这些内容,你可以深入理解ASP.NET如何利用HTTP长连接来实现实时通信,以及如何构建聊天室或其他需要实时数据更新的应用。这将有助于提升你的ASP.NET编程技能,尤其是处理高并发、实时性需求的场景。

    ASP.NET 长连接做得在线聊天例子

    在这个"ASP.NET 长连接做得在线聊天例子"中,我们将深入探讨如何利用ASP.NET技术实现一个实时的在线聊天系统,主要关注长连接的概念及其在聊天应用中的应用。 一、ASP.NET长连接 传统的HTTP协议是基于短连接的,即...

    c# Socket长连接 短链接 自己封装 通讯

    标题“c# Socket长连接 短链接 自己封装 通讯”揭示了我们将讨论的主题:如何使用C#实现Socket的长连接和短连接,并自定义通信协议。这里的关键点包括: 1. **Socket基础**:Socket是网络通信中的一个抽象概念,它...

    Mina长连接短连接实例

    本文将深入探讨Mina框架中的长连接与短连接,并通过提供的Minaclient和MinaHost工程实例进行详细解析。 首先,我们需要了解什么是长连接和短连接。在TCP/IP通信中,短连接是指一次完整的通信过程(如HTTP请求)结束...

    MQTT长连接

    与HTTP协议的短连接不同,MQTT的长连接允许客户端和服务器之间保持持续的会话状态,从而减少了建立和关闭连接的开销,提高了数据传输效率。这种连接方式对于需要频繁交换数据或者需要长时间在线的设备尤其重要,例如...

    [线上问题] Nginx与Tomcat、Client之间请求的长连接配置不一致问题分析解决

    通过上述知识点的整理,我们可以深入理解Nginx与Tomcat以及客户端之间请求的长连接配置不一致问题的分析解决方法,同时也能掌握netstat命令在网络连接管理中的作用及其用法。这些知识点对于IT专业人员来说是必备的,...

    c#长连接案例服务器推进器

    在IT行业中,长连接是一种网络通信模式,与短连接相对,它允许客户端和服务器之间保持持续不断的数据传输,而不需要反复建立和断开连接。...通过学习和分析这个案例,开发者可以更好地理解和应用长连接技术。

Global site tag (gtag.js) - Google Analytics