严格地说,WebSocket技术不属于HTML5,这个技术是对HTTP无状态连接的一种革新,本质就是一种持久性socket连接,在浏览器客户端通过javascript进行初始化连接后,就可以监听相关的事件和调用socket方法来对服务器的消息进行读写操作。与Ajax相比,Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信,这个特性导致我们至少可以用来做远控。

WebSocket实现了全双工通信,使WEB上的真正的实时通信成为可能。浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在WebSocket协议中,为我们实现即时服务带来了三个好处:

  1. 客户端和服务器端之间数据传输时请求头信息比较小,大概2个字节。
  2. 服务器和客户端可以相互主动的发送数据给对方。
  3. 不需要多次创建TCP请求和销毁,节约宽带和服务器的资源。

WebSocket的官方地址是:www.websocket.org,其中给出了一些样例,可以直接在线测试。

对于WebSocket,目前浏览器支持情况如下:
Chrome
Supported in version 4+
Firefox
Supported in version 4+
Internet Explorer
Supported in version 10+
Opera
Supported in version 10+
Safari
Supported in version 5+

服务器支持情况如下:

服务器名称 下载网址
Tomcat服务器 http://tomcat.apache.org
Php服务器 http://code.google.com/p/phpwebsocket
Node服务器 http://nodejs.org
Ruby服务器 http://github.com/gimite/web-socket-ruby
Jetty服务器 http://jetty.codehaus.org/jetty/
Netty服务器 http://www.jboss.org/netty
Kaazing服务器 http://www.kaazizng.org/confluence/KAAZING/Home

这里选择Node服务器,创建WebSocket Node.js应用程序事实上的标准库Socket.IO。node.js提供了高效的服务端运行环境,socket.io基于node.js并简化了WebSocket API,统一了通信的API,统一了服务端与客户端的编程方式。

与很多其他的Node.js库相似,Socket.IO也是一个NPM模块,可以按如下方式进行安装:

$ npm install socket.io

下面是一个基于Socket.IO的WebSocket聊天应用程序

Node.js服务器端代码server.js:

var io = require('socket.io').listen(4000);
io.sockets.on('connection', function (socket) {
socket.on('clientMessage', function(content) {
socket.emit('serverMessage', 'You said: ' + content);
socket.broadcast.emit('serverMessage', socket.id + ' said: ' +
content);
});
});

客户端代码client.html:

<html>
<head>
<title>Node.js WebSocket chat</title>
<style type="text/css">
#input {
width: 200px;
}
#messages {
position: fixed;
top: 40px;
bottom: 8px;
left: 8px;
right: 8px;
border: 1px solid #EEEEEE;
padding: 8px;
}
</style>
</head> <body> Your message:
<input type="text" id="input"> <div id="messages"></div> <script src="http://localhost:4000/socket.io/socket.io.js"></script>
<script type="text/javascript">
var messagesElement = document.getElementById('messages');
var lastMessageElement = null; function addMessage(message) {
var newMessageElement = document.createElement('div');
var newMessageText = document.createTextNode(message); newMessageElement.appendChild(newMessageText);
messagesElement.insertBefore(newMessageElement,
lastMessageElement);
lastMessageElement = newMessageElement;
} var socket = io.connect('http://localhost:4000');
socket.on('serverMessage', function(content) {
addMessage(content);
}); var inputElement = document.getElementById('input'); inputElement.onkeydown = function(keyboardEvent) {
if (keyboardEvent.keyCode === 13) {
socket.emit('clientMessage', inputElement.value);
inputElement.value = '';
return false;
} else {
return true;
}
};
</script> </body>
</html>

最新文章

  1. sql之连表查询--效率 通过分析各种连接查询的实现原理来了解
  2. 第59讲:Scala中隐式转换初体验
  3. 控件(按钮类): ButtonBase, Button, HyperlinkButton, RepeatButton, ToggleButton, AppBarButton, AppBarToggleButton
  4. ios多线程开发的常用三种方式
  5. vmware screen
  6. 我的工具箱之MySql Front 5.3
  7. Flash AIR 保存与读取
  8. Bestcoder Round#45
  9. enode框架
  10. SVN 在 Xcode中的状态说明
  11. servlet多次跳转报IllegalStateException异常
  12. 马的遍历 洛谷 p1443
  13. python学习笔记(九)、模块
  14. ActiveMQ的queue以及topic两种消息处理机制分析
  15. [Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类
  16. error link 2019 waveout
  17. [转]基于boot2docker部署Docker环境
  18. R语言做一元线性回归
  19. 关于Java单例模式中懒汉式和饿汉式的两种类创建方法
  20. input type=&quot;number&quot;时,maxlength不起作用怎么解决

热门文章

  1. opencv mser算法框出图片文字区域
  2. if判断、while循环、for循环
  3. [UE4]Overlay
  4. [UE4]缓存选项 Is volatile
  5. C#根据进程名称获取进程的句柄?
  6. 互斥锁,IPC队列
  7. Android 6.0动态申请权限时,权限框闪一下就消失的问题;
  8. solr 打分和排序机制(转载)
  9. linux:apt-get 如何安装,查询,解除依赖包
  10. ajax事件执行顺序