记websocket(windows系统下nodejs,node-websocket-server实现简单聊天)
2012-06-28 17:35
806 查看
websocket原理这里不再叙述,网上文章很多。
这里主要说一下我配置的过程。
nodejs的安装过程:下载地址直接安装就OK了
我直接按默认目录来安装的。
安装完之后安装websocket-server(现在新版本的nodejs支持在windows系统上直接运行upm及node命令)
在项目目录下在运行态输入如下的命令(注意是在项目目录下)
npm install websocket-server
现在nodejs与websocket-server已经安装完毕。
将服务器端写在某个js中
在运行台中输入如下命令,开启服务器:
在safari浏览器中调试。
不要使用谷歌浏览器,会出现如下的错误:Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
原因如下:
因为websocket协议已经更新到13版本。
客户端发送数据格式类似这样:
服务端返回的信息是:
但是之前的版本是这样的:
客户端发送数据格式类似这样:
GET /chat HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.zendstudio.net:9108
Origin: http://www.zendstudio.net
Cookie: somenterCookie
此时服务端应该返回的信息是:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.zendstudio.net
WebSocket-Location: ws://www.zendstudio.net:9108/chat
从这里我们太容易看出来,websocket协议的握手部分根本就是个类http的协议,所不同的是http每次都会有这样子的头信息交互,这在某些时候不得不显得很糟糕。而websocket只会执行一次这个过程,之后的传输信息就变得异常简洁了。
这里我们发现,version 13这个版本的websocket协议,与之前版本最大不同就是多了一个验证,客户端会发送一个“Sec-WebSocket-Key”的base64编码的密钥,要求服务端必须返回一个“Sec-WebSocket-Accept”,否则客户端会抛出一个“Error during WebSocket handshake: Sec-WebSocket-Accept mismatch”错误之后,关闭连接,当然,这个Sec-WebSocket-Accept的值是计算出来的。
谷歌14版本+支持新的标准,而websocket-server是按原来的版本写的。火狐也有类似的原因。
运行结果如下:
参考文章:点击
这里主要说一下我配置的过程。
nodejs的安装过程:下载地址直接安装就OK了
我直接按默认目录来安装的。
安装完之后安装websocket-server(现在新版本的nodejs支持在windows系统上直接运行upm及node命令)
在项目目录下在运行态输入如下的命令(注意是在项目目录下)
npm install websocket-server
现在nodejs与websocket-server已经安装完毕。
将服务器端写在某个js中
var conns = new Array(); var ws = require('websocket-server'); var server = ws.createServer(); server.addListener('connection', function(conn) { console.log('connection....'); conns.push(conn); conn.addListener('message',function(msg) { console.log(msg); for(var i=0; i<conns.length; i++) { if(conns[i]!=conn) { conns[i].send(msg); } } }); }); server.listen(8080); console.log('running......');客户端,代码如下:
<html> <head> <meta charset="utf-8" /> <script type="text/javascript"> var host = '127.0.0.1'; var port = 8080; var url = 'ws://'+host+':'+port+'/'; var w = new WebSocket(url); //构建于服务器之间的连接通信 <!--var audioElement = document.createElement('audio'); --> <!--audioElement.setAttribute('src', 'qqmsg.mp3');--> w.onopen = function()//通过onopen事件句柄来监听socket的打开事件 { $('chat-box').innerHTML = '已连接到服务器......<br/>'; } w.onmessage = function(e)//用onmessage事件句柄接受服务器传过来的数据 { var msg = e.data; var chatBox = $('chat-box'); // audioElement.play(); chatBox.innerHTML = chatBox.innerHTML+msg+'<br/>'; } function send()//使用send方法向服务器发送数据 { var talk = $('talk'); var nike = $('nike'); w.send('<strong style="color:red">'+nike.value+':</strong>'+talk.value); } function $(id) { return document.getElementById(id); } </script> </head> <body> <div id="chat-box" style="border:1px solid #cccccc; width:400px; height:400px; overflow:scroll;"></div> 昵称: <input type="text" id="nike"/> <br/> 内容: <input type="text" id="talk"/> <input type="button" id="send" onClick="send();" value="发送"/> </body> </html>目录结构如下:
在运行台中输入如下命令,开启服务器:
在safari浏览器中调试。
不要使用谷歌浏览器,会出现如下的错误:Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
原因如下:
因为websocket协议已经更新到13版本。
客户端发送数据格式类似这样:
GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com ^n:ds[4U
服务端返回的信息是:
HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS’y:G*Co,Wxa-
但是之前的版本是这样的:
客户端发送数据格式类似这样:
GET /chat HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: www.zendstudio.net:9108
Origin: http://www.zendstudio.net
Cookie: somenterCookie
此时服务端应该返回的信息是:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.zendstudio.net
WebSocket-Location: ws://www.zendstudio.net:9108/chat
从这里我们太容易看出来,websocket协议的握手部分根本就是个类http的协议,所不同的是http每次都会有这样子的头信息交互,这在某些时候不得不显得很糟糕。而websocket只会执行一次这个过程,之后的传输信息就变得异常简洁了。
这里我们发现,version 13这个版本的websocket协议,与之前版本最大不同就是多了一个验证,客户端会发送一个“Sec-WebSocket-Key”的base64编码的密钥,要求服务端必须返回一个“Sec-WebSocket-Accept”,否则客户端会抛出一个“Error during WebSocket handshake: Sec-WebSocket-Accept mismatch”错误之后,关闭连接,当然,这个Sec-WebSocket-Accept的值是计算出来的。
谷歌14版本+支持新的标准,而websocket-server是按原来的版本写的。火狐也有类似的原因。
运行结果如下:
参考文章:点击
相关文章推荐
- iOS&Node 搭建WebSocketServer实现聊天
- WebSocket实现简单客服聊天系统
- 使用cocoscreator + node.js + websocket实现简单的聊天服务
- websocket+node.js实现实时聊天系统问题咨询
- NodeJS+(Node-WebSocket-Server)+HTML5 WebSocket实现websocket
- 用Java实现Server-Client结构的聊天系统
- 简单实现windows系统普通或强制关机重启注销的功能
- HTML5 WebSocket(Client) + JavaWeb(Server) 实现简单的聊天室功能
- 基于WebSocet简单聊天室(NodeJS + node-websocket-server)
- websocket 入门系列:三 netty实现简单聊天
- windows网络编程(九)——IOCP+多线程实现简单的聊天(windows服务器端 windows客户端)
- ubuntu 12.04 server 硬盘安装实现windows 双系统
- 关于java通信的一个简单聊天系统的实现
- Java swing实现简单的C/S聊天及文件传输系统
- 套接字(socket)编程简单实现server-client聊天程序
- Node.js实现简单聊天服务器
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
- 在linux下实现简单聊天系统(一)项目基本框架内容
- 关于java通信的一个简单聊天系统的实现
- Node.js和MongoDB实现简单日志分析系统