`

WebSocket in HTML5

阅读更多
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法 有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名为Socket.IO。

一、什么是WebSocket API?

WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。 WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。

WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为 Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

二、WebSocket API的用法

只专注于客户端的API,因为每个服务器端语言有自己的API。下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。

CODE:
// 创建一个Socket实例
var socket = new WebSocket('ws://localhost:8080'); 

// 打开Socket 
socket.onopen = function(event) { 

  // 发送一个初始化消息
  socket.send('I am the client and I\'m listening!'); 

  // 监听消息
  socket.onmessage = function(event) { 
    console.log('Client received a message',event); 
  }; 

  // 监听Socket的关闭
  socket.onclose = function(event) { 
    console.log('Client notified socket has closed',event); 
  }; 

  // 关闭Socket.... 
  //socket.close() 
};

让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。

onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。

WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。IE浏览器目前不支持WebSocket通信。如果你的客户端不支持WebSocket通信,下面有几个后备方案供你使用:

Flash技术 —— Flash可以提供一个简单的替换。 使用Flash最明显的缺点是并非所有客户端都安装了Flash,而且某些客户端,如iPhone/iPad,不支持Flash。

AJAX Long-Polling技术 —— 用AJAX的long-polling来模拟WebSocket在业界已经有一段时间了。它是一个可行的技术,但它不能优化发送的信息。也就是说,它是一个解决方案,但不是最佳的技术方案。

由于目前的IE等浏览器不支持WebSocket,要提供WebSocket的事件处理、返回传输、在服务器端使用一个统一的API,那么该怎么办呢?幸运的是,Guillermo Rauch创建了一个Socket.IO技术。

三、带Socket.IO的WebSocket

Socket.IO 是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立 WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。
建立客户端Socket.IO

Socket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:

CODE:

// 创建Socket.IO实例,建立连接
var socket= new io.Socket('localhost',{ 
  port: 8080 
}); 
socket.connect(); 

// 添加一个连接监听器
socket.on('connect',function() { 
  console.log('Client has connected to the server!'); 
});

// 添加一个连接监听器
socket.on('message',function(data) { 
  console.log('Received a message from the server!',data); 
});

// 添加一个关闭连接的监听器
socket.on('disconnect',function() { 
  console.log('The client has disconnected!'); 
}); 

// 通过Socket发送一条消息到服务器
function sendMessageToServer(message) { 
  socket.send(message); 
}

Socket.IO简化了WebSocket API,统一了返回运输的API。传输包括:
WebSocket
Flash Socket
AJAX long-polling
AJAX multipart streaming
IFrame
JSONP polling

你还可以设置任意的Socket.IO构造器的第二个选项,选项包括:

port - 待连接的端口
transports - 一个数组,包含不同的传输类型
transportOptions - 传输的参数使用的对象,带附加属性

Socket.IO还提供了由本地WebSocket API提供的普通连接、断开连接、消息事件。Socket还提供了封装每个事件类型的方法。

四、NodeJS和Socket.IO联合开发

Socket.IO提供的服务器端解决方案,允许统一的客户端和服务器端的API。使用Node,你可以创建一个典型的HTTP服务器,然后把服务器的实例传递到Socket.IO。从这里,你创建连接、断开连接、建立消息监听器,跟在客户端一样。

一个简单的服务器端脚本看起来如下:

CODE:
// 需要HTTP 模块来启动服务器和Socket.IO
var http= require('http'), io= require('socket.io'); 

// 在8080端口启动服务器
var server= http.createServer(function(req, res){ 
  // 发送HTML的headers和message
  res.writeHead(200,{ 'Content-Type': 'text/html' }); 
  res.end('<h1>Hello Socket Lover!</h1>'); 
}); 
server.listen(8080); 

// 创建一个Socket.IO实例,把它传递给服务器
var socket= io.listen(server); 

// 添加一个连接监听器
socket.on('connection', function(client){ 

  // 成功!现在开始监听接收到的消息
  client.on('message',function(event){ 
    console.log('Received message from client!',event); 
  }); 
  client.on('disconnect',function(){ 
    clearInterval(interval); 
    console.log('Server has disconnected'); 
  }); 
});

你可以运行服务器部分,假定已安装了NodeJS,从命令行执行:

 
node socket-server.js

现在客户端和服务器都能来回推送消息了!在NodeJS脚本内,可以使用简单的JavaScript创建一个定期消息发送器:

CODE:
// 创建一个定期(每5秒)发送消息到客户端的发送器
var interval= setInterval(function() { 
  client.send('This is a message from the server! ' + new Date().getTime()); 
},5000);

服务器端将会每5秒推送消息到客户端!

五、dojox.Socket和Socket.IO

Persevere的创建者Kris Zyp创建了dojox.Socket。dojox.Socket以Dojo库一致的方式封装了WebSocket API,用于在客户端不支持WebSocket时,使用long-polling替代。

下面是怎样在客户端使用dojox.Socket和在服务器端使用Socket.IO的例子:

CODE:
var args, ws= typeof WebSocket!= 'undefined'; 
var socket= dojox.socket(args= { 
  url: ws? '/socket.io/websocket' : '/socket.io/xhr-polling', 
  headers:{ 
    'Content-Type':'application/x-www-urlencoded' 
  }, 
  transport: function(args, message){ 
    args.content = message; // use URL-encoding to send the message instead of a raw body 
    dojo.xhrPost(args); 
  }; 
}); 
var sessionId; 
socket.on('message', function(){ 
  if (!sessionId){ 
    sessionId= message; 
    args.url += '/' + sessionId; 
  }else if(message.substr(0, 3) == '~h~'){ 
   // a heartbeat 
  } 
});

dojox.socket.Reconnect还创建了在套接字失去连接时自动重连。期待包含dojox.Socket的Dojo 1.6版本早日发布。

六、实际应用和WebSocket资源

有很多WebSocke的实际应用。WebSocket对于大多数客户机-服务器的异步通信是理想的,在浏览器内聊天是最突出的应用。WebSocket由于其高效率,被大多数公司所使用。

WebSocket资源
Socket.IO站点:http://socket.io/
WebSocket的Wikipedia:http://en.wikipedia.org/wiki/WebSockets
WebSockets.org站点:http://www.websockets.org/
Dojo WebSocket站点:http://www.sitepen.com/blog/2010/10/31/dojo-websocket/
Page from : http://www.cnblogs.com/wei2yi/archive/2011/03/23/1992830.html
分享到:
评论

相关推荐

    WebSocket.Essentials.Building.Apps.with.HTML5.WebSockets

    This book is for web developers who want to learn and implement WebSocket to create interesting apps for modern browsers, leveraging the capabilities of HTML5 with WebSockets. In Detail WebSocket ...

    C# mvc websocket 在线聊天实例

    foreach (var webSocket in _webSockets.Values) { try { var buffer = Encoding.UTF8.GetBytes(message); await webSocket.SendAsync(new ArraySegment(buffer), WebSocketMessageType.Text, true, ...

    WebSocket in ASP.NET Core.rar

    WebSocket协议是HTML5标准的一部分,它的出现解决了HTTP协议的不足,HTTP协议在每次请求-响应交互后都需要关闭连接,而WebSocket可以在一个持久连接上进行多次数据交换。这使得WebSocket非常适合实时应用,如在线...

    Java WebSocket 多人聊天室Deomo

    在客户端,我们通常使用HTML5的WebSocket API来创建连接并发送/接收消息。JavaScript代码可能如下: ```javascript var socket = new WebSocket('ws://localhost:8080/chat'); socket.onopen = function(event) { ...

    The WebSocket library in C.zip

    这个压缩包“The WebSocket library in C.zip”可能包含了用于在C语言中实现WebSocket功能的源代码、示例、文档和相关工具。 首先,WebSocket协议的核心特性在于它在TCP连接之上提供了一个简化的握手过程和数据帧...

    WinHTTP WebSocket 代码

    HTML 5 Web Sockets is a powerful and effective technique for real-time information processing. There exists many techniques such as Poling, Long Poling and Streaming that are said to be better earier ...

    C# WebSocket示例

    foreach (WebSocket client in clients) { if (client != excludeClient && client.State == WebSocketState.Open) { await client.SendAsync(Encoding.UTF8.GetBytes(message), WebSocketMessageType.Text, true...

    基于HTML5的WebSocket的实例代码

    基于HTML5的WebSocket的实例代码 客户端代码: &lt;html&gt; &lt;head&gt; [removed] var socket; if (WebSocket in window) { var ws = new WebSocket(ws://127.0.0.1:8181); socket = ws; ws.onopen = function()...

    Spring Websocket

    **5. 服务器端处理** 在服务器端,我们可以创建一个@Controller类,使用@MessageMapping和@SendTo注解来处理来自客户端的消息和向客户端发送消息。例如: ```java @Controller public class GreetingController { ...

    vue2 使用websocket搭建简易版多人聊天应用,包含服务端和前端

    (msg, index) in messages" :key="index"&gt;{{ msg }} export default { data() { return { message: '', messages: [] } }, methods: { sendMessage() { this.$websocket.emit('chat.message', this...

    HTML5 WebSocket实现点对点聊天的示例代码

    System.out.println("Error in websocket connection " + ex.getMessage()); } } ``` `MessageInbound` 类的 `onOpen` 方法会在WebSocket连接建立时被调用,`onMessage` 方法处理接收到的文本消息,`onClose` 方法...

    FastApi、Websocket、多人聊天室

    for conn in connections: if conn != websocket: await conn.send_text(message) ``` 以上代码定义了一个WebSocket路由`/ws`,当用户连接到该端点时,服务器会接受连接并将客户端添加到连接列表中。然后在一个...

    Websocket-Five-in-a-row:一个使用 WebSocket 协议的 HTML5 多人游戏

    #Five-in-a-row AB/S HTML5 网络游戏,使用 WebSocket 协议。 前端使用Bootstrap框架,服务端使用tomcat WebSocket API。 双方做好准备后,比赛开始,下棋。部署####About Client 更改WebSocket连接地址(在client/...

    simple-websocket-client:一个非常简单的 html javascript WebSocket 客户端

    简单的 Javascript Websocket 客户端一个非常简单的 html/javascript WebSocket 客户端,可用于测试我的 . 此客户端说明了如何连接到 websocket 端点、发送和接收数据、关闭连接。 我写了一篇关于 WebSockets in ...

    Spring-Boot-Jetty-WebSocket-Example:如何使用Spring Boot配置Jetty WebSocket的基本示例

    2. **WebSocket API**:WebSocket是HTML5引入的一种协议,它允许在客户端和服务器之间建立长连接,实现双向通信。相比传统的HTTP请求,WebSocket提供更低的延迟和更高的效率。 3. **Jetty服务器**:Jetty是一个轻量...

    websocket_test:测试websocket使用node.js

    然后,启动服务器端程序,如`node server.js`,接着在客户端(可能是浏览器中的HTML页面)建立WebSocket连接。一旦连接建立,就可以通过WebSocket对象的send方法发送数据,通过onmessage事件处理函数接收服务器发来...

Global site tag (gtag.js) - Google Analytics