<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://sound.bai-hua.org/index.php?action=history&amp;feed=atom&amp;title=WebSocket</id>
		<title>WebSocket - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://sound.bai-hua.org/index.php?action=history&amp;feed=atom&amp;title=WebSocket"/>
		<link rel="alternate" type="text/html" href="https://sound.bai-hua.org/index.php?title=WebSocket&amp;action=history"/>
		<updated>2026-10-01T12:13:58Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://sound.bai-hua.org/index.php?title=WebSocket&amp;diff=342&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;{{noteTA|G1=IT}} &#039;&#039;&#039;WebSocket&#039;&#039;&#039; 是HTML5一种新的协议。它是实现了浏览器与伺服器的双向通讯。  在 WebSocket API 中，浏览器和伺服器只需要要做...&quot;</title>
		<link rel="alternate" type="text/html" href="https://sound.bai-hua.org/index.php?title=WebSocket&amp;diff=342&amp;oldid=prev"/>
				<updated>2011-11-09T19:58:03Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{noteTA|G1=IT}} &amp;#039;&amp;#039;&amp;#039;WebSocket&amp;#039;&amp;#039;&amp;#039; 是HTML5一种新的协议。它是实现了浏览器与伺服器的双向通讯。  在 WebSocket API 中，浏览器和伺服器只需要要做...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA|G1=IT}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;WebSocket&amp;#039;&amp;#039;&amp;#039; 是HTML5一种新的协议。它是实现了浏览器与伺服器的双向通讯。&lt;br /&gt;
&lt;br /&gt;
在 WebSocket API 中，浏览器和伺服器只需要要做一个握手的动作，然后，浏览器和伺服器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。&lt;br /&gt;
&lt;br /&gt;
==背景==&lt;br /&gt;
现在，很多网站为了实现即时通讯，所用的技术都是[[轮询]]。轮询是在特定的的时间间隔（如每1秒），由浏览器对伺服器发出HTTP request，然后由伺服器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点，即浏览器需要不断的向伺服器发出请求，然而HTTP request 的header是非常长的，里面包含的数据可能只是一个很小的值，这样会占用很多的带宽和服务器资源。&lt;br /&gt;
&lt;br /&gt;
而比较新的技术去做轮询的效果是[[Comet (web技术)|Comet]]，使用了AJAX。但这种技术虽然可达到双向通信，但依然需要发出请求，而且在Comet中，普遍采用了[[HTTP持久链接|长链接]]，这也会大量消耗服务器带宽和资源。&lt;br /&gt;
&lt;br /&gt;
面对这种状况，[[HTML5]]定义了WebSocket协议，能更好的节省服务器资源和带宽并达到实时通讯。&lt;br /&gt;
&lt;br /&gt;
==优点==&lt;br /&gt;
&lt;br /&gt;
===Header===&lt;br /&gt;
&lt;br /&gt;
服务器与客户端之间交换的標头信息很小，大概只有2字节。&lt;br /&gt;
&lt;br /&gt;
===服务器推送===&lt;br /&gt;
&lt;br /&gt;
伺服器可以主动传送数据给客户端。&lt;br /&gt;
&lt;br /&gt;
== 握手协议 ==&lt;br /&gt;
&lt;br /&gt;
在实现websocket连线过程中，需要透过浏览器发出websocket连线请求，然后伺服器发出回应，这个过程通常称为“握手” (handshaking)。&amp;lt;br&amp;gt;&lt;br /&gt;
PS1:握手協議在後期的版本中，會標明版本編號，下面的例子屬於早期的協定之一，對於新版的 [[chrome]] 和 [[Firefox]] 皆不適用。&amp;lt;br&amp;gt;&lt;br /&gt;
PS2:後期的版本大多屬於功能上的擴充，例如使用第7版的握手協議同樣也適用於第8版的握手協議。&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===例子===&lt;br /&gt;
浏览器请求&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /demo HTTP/1.1&lt;br /&gt;
Host: example.com&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Key2: 12998 5 Y3 1  .P00&lt;br /&gt;
Sec-WebSocket-Protocol: sample&lt;br /&gt;
Upgrade: WebSocket&lt;br /&gt;
Sec-WebSocket-Key1: 4 @1  46546xW%0l 1 5&lt;br /&gt;
Origin: http://example.com&lt;br /&gt;
^n:ds[4U&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
伺服器回应&lt;br /&gt;
&amp;lt;pre&amp;gt;HTTP/1.1 101 WebSocket Protocol Handshake&lt;br /&gt;
Upgrade: WebSocket&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Origin: http://example.com&lt;br /&gt;
Sec-WebSocket-Location: ws://example.com/demo&lt;br /&gt;
Sec-WebSocket-Protocol: sample&lt;br /&gt;
8jKS’y:G*Co,Wxa-&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 原理 ===&lt;br /&gt;
&lt;br /&gt;
在请求中的“Sec-WebSocket-Key1”, “Sec-WebSocket-Key2”和最后的“^n:ds[4U”都是随机的，服务器端会用这些数据来构造出一个16字节的应答。&lt;br /&gt;
&lt;br /&gt;
把第一个Key中的数字除以第一个Key的空白字符的数量，而第二个Key也是如此。然后把这两个结果与请求最后的8字节字符串连接起来成为一个字符串，服务器应答正文（“8jKS’y:G*Co,Wxa-”）即这个字符串的MD5 sum。&lt;br /&gt;
&lt;br /&gt;
== 浏览器 ==&lt;br /&gt;
&lt;br /&gt;
实现websocket的协议，浏览器扮演着一个很重要的角色。[[Google]]在它的[[Google Chrome]]支持了websocket，Chrome 5 之后的版本都支持websocket，但因为websocket还未最终版本，草案不断更新，所以不同的版本会支持不同的草案。&lt;br /&gt;
&lt;br /&gt;
[[苹果公司]]的[[Safari]]浏览器也支持websocket。([[iPhone]]4上的[[safari]]使用的WebSocket是舊版的握手協議,可以使用本頁的握手協議來製做[[伺服器]]端)&lt;br /&gt;
&lt;br /&gt;
起初，[[Mozilla基金會]]的[[Mozilla Firefox]]会在4版本支持websocket。[[Opera软件公司]]方面在[[Opera]] 10.7和11.0的预览版本中也支持了websocket。然而，基于安全因素的考虑&amp;lt;ref&amp;gt;http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/&amp;lt;/ref&amp;gt;，两家宣布将暂时移除该功能。&lt;br /&gt;
&lt;br /&gt;
FireFox預計於版本6重新實作WebSockets RFC Version -07 ，但此版本實作並不向後相容，故舊版本的伺服器實作軟體有可能無法順利執行。版本6之中的WebSocket功能將會預設開啟&amp;lt;ref&amp;gt;https://developer.mozilla.org/en/WebSockets/&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
PS: 在[[FireFox]]6的版本裡，WebSocket 被更名為 [[MozWebSocket]]，但是該 class 的成員與用法皆與 WebSocket 相同。&lt;br /&gt;
&lt;br /&gt;
== 伺服器 ==&lt;br /&gt;
&lt;br /&gt;
在伺服器方面，网上都有不同对websocket支持的伺服器：&lt;br /&gt;
&lt;br /&gt;
* php - http://code.google.com/p/phpwebsocket/&lt;br /&gt;
* jetty - http://jetty.codehaus.org/jetty/ (版本7才开始支持websocket)&lt;br /&gt;
* netty - http://www.jboss.org/netty&lt;br /&gt;
* ruby - http://github.com/gimite/web-socket-ruby&lt;br /&gt;
* Kaazing - http://www.kaazing.org/confluence/display/KAAZING/Home&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>