HTML5 Web Sockets
HTML5 Web Sockets规范定义了Web Sockets API,支持页面使用Web Socket协议与远程主机进行全双工的通信。它引入了WebSocket接口并且定义了一个全双工的通信通道,通过一个单一的套接字在Web上进行操作。HTML5 Web Sockets以最小的开销高效地提供了Web连接。相较于经常需要使用推送实时数据到客户端甚至通过维护两个HTTP连接来模拟全双工连接的旧的轮询或长轮询(Comet)来说,这就极大的减少了不必要的网络流量与延迟。
要使用HTML5 Web Sockets从一个Web客户端连接到一个远程端点,你要创建一个新的WebSocket实例并为之提供一个URL来表示你想要连接到的远程端点。该规范定义了ws://以及wss://模式来分别表示WebSocket和安全WebSocket连接。一个WebSocket连接是在客户端与服务器之间HTTP协议的初始握手阶段将其升级到Web Socket协议来建立的,其底层仍是TCP/IP连接。
HTML5 Web Sockets使用HTTP Upgrade机制升级到Web Socket协议。HTML5 Web Sockets有着兼容HTTP的握手机制,因此HTTP服务器可以与WebSocket服务器共享默认的HTTP与HTTPS端(80和443)。要建立一个WebSocket连接,客户端和服务器在初次握手的时候从HTTP协议提升到Web Socket协议,如例1所展示的。一旦连接建立,WebSocket数据帧就可以以全双工的模式在客户端和服务器之间来回传输。
尽管HTML5 Web Socket协议本身并不知晓代理服务器和防火墙,但它具有HTTP兼容的握手这一特,因此HTTP服务器可以和WebSocket服务器共享它们默认的HTTP和HTTPS端口(80和443)。一些代理服务器于Web Sockets无害并且能很好的工作,其它一些有可能妨碍Web Sockets正常工作,导致连接失败。在一些情况下可能需要一些额外的代理服务器配置,而一些特定的代理服务器可能需要被升级以支持Web Sockets。
如果一个浏览器被配置为使用显式的代理服务器(对于加密和未加密的WebSocket连接都是),那么在建立WebSocket连接时它首先会发出一个HTTPCONNECT方法到那个代理服务器。
如果使用的是一个未加密的WebSocket连接(ws://),那么在透明的代理服务器情况下,浏览器是不知道代理服务器的,所以不会发送HTTP CONNECT方法。因此,在目前的实践中连接通常会失败。
如果使用的是加密的WebSocket安全连接(wss://),那么在透明代理服务器下,浏览器不知道代理服务器,所以不会发出 HTTP CONNECT方法。然而,因为线上信息是加密的,中间透明代理服务器会简单的让加密信息通过,因此使用加密的WebSocket连接而成功建立W
ebSocket连接的几率就大大增加了。
kaazing WebSocket网关是高度优化的,代理感知的WebSocket网关,提供原生的WebSocket支持和针对上一代浏览器的Web Socket模拟功能。如果中间代理服务器被检测到,那么下行HTTP信息流就会使用一个高度优化的加密流式连接。这是通过Kaazing底层通过跨源的HTTP和HTTPS请求支持来实现的。在这一方面,不管是原生的或模拟的方式,我们可以通过WebSocket网关100%的建立WebSocket连接。
客户端javascript代码:
$(document).ready(function() {
if(!("WebSocket" in window)){
$('#chatLog, input, button, #examples').fadeOut("fast");
$('<p>Oh no, you need a browser that supports WebSockets. How about <a href="le/chrome">Google Chrome</a>?</p>').appendTo('#container');
}else{
if(!("WebSocket" in window)){
$('#chatLog, input, button, #examples').fadeOut("fast");
$('<p>Oh no, you need a browser that supports WebSockets. How about <a href="le/chrome">Google Chrome</a>?</p>').appendTo('#container');
}else{
//The user has WebSockets
connect();
function connect(){
var socket;
var host = "ws://localhost:8000/socket/server/startDaemon.php";
//获取服务端socket对象
try{
var socket = new WebSocket(host);
//实例化对象
message('<p class="event">Socket Status: '+socket.readyState);
socket.onopen = function(){ //与服务器连接事件
message('<p class="event">Socket Status: '+socket.readyState+' (open)');
connect();
function connect(){
var socket;
var host = "ws://localhost:8000/socket/server/startDaemon.php";
//获取服务端socket对象
try{
var socket = new WebSocket(host);
//实例化对象
message('<p class="event">Socket Status: '+socket.readyState);
socket.onopen = function(){ //与服务器连接事件
message('<p class="event">Socket Status: '+socket.readyState+' (open)');
}
socket.onmessage = function(msg){ //获取服务端推送信息数据事件
message('<p class="message">Received: '+msg.data);
}
socket.onclose = function(){ //socket关闭连接事件
message('<p class="event">Socket Status: '+socket.readyState+' (Closed)');
}
websocket和socket } catch(exception){
message('<p>Error'+exception);
}
function send(){
socket.onmessage = function(msg){ //获取服务端推送信息数据事件
message('<p class="message">Received: '+msg.data);
}
socket.onclose = function(){ //socket关闭连接事件
message('<p class="event">Socket Status: '+socket.readyState+' (Closed)');
}
websocket和socket } catch(exception){
message('<p>Error'+exception);
}
function send(){
var text = $('#text').val();
if(text==""){
message('<p class="warning">Please enter a message');
return ;
}
try{
socket.send(text); //向服务端发送信息
message('<p class="event">Sent: '+text)
} catch(exception){
message('<p class="warning">');
}
$('#text').val("");
}
if(text==""){
message('<p class="warning">Please enter a message');
return ;
}
try{
socket.send(text); //向服务端发送信息
message('<p class="event">Sent: '+text)
} catch(exception){
message('<p class="warning">');
}
$('#text').val("");
}
function message(msg){
$('#chatLog').append(msg+'</p>');
}
$('#text').keypress(function(event) {
if (event.keyCode == '13') {
send();
}
});
$('#disconnect').click(function(){
socket.close();
});
}//End connect
}//End else
});
}//End else
});
服务端代码详见
另,网络资料整理。
/html5/websockets/
blog.csdn/ant_yan/article/details/4231809
www.itivy/html5/archive/2011/12/23/html5-websockets-api-usage.html
www.silverlightchina/html/HTML_5/study/2011/1213/12513.html
www.uini/2010/08/html5-websockets-based-tutorial.html
www.undisciplinedbytes/2010/06/html-5-c-web-sockets-server-and-asp-net-client-implementation/
/program/viewdetail.php?i=29842
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论