一、node.js和websocket
node.js是个js的运行环境,封装了对
GoogleV8引擎(应用于Google Chrome
浏览器);
websocket的握手是通过http协议来实现的,握手成功,下面就是websocket协议部分了,不是http了。
WebSocket 协议本质上是一个基于 TCP 的协议。解决了Web Pages (Client) 和远程主机的双向通信问题
WebSocket API 规范由 W3C制定, WebSocket 协议规范由 IETF 制定 (RFC 6455)。是
HTML5一种新的协议下载安装如下:wget
http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz 解压缩,切到压缩路径下:./configrue;make;make install
安装node.js的websocket模块;npm Install webscoket等
进入到node-v0.6.14/node_modules/test
在libwebsockets-test.html的head部分加入<script src='libwebsockets-test-client.js'></script>
启动websocket服务node
libwebsockets-test-server.js --port=8000(或是其他的端口号)
然后我们就可以在客户端访问这个8000端口,可以正确的访问到这个页面;
在调试的时候要注意,服务器和客户端要放在以前,原因就是在很多的例子,使用了socket.io这个node.js的扩展库,
如果客户端没有这个,那是不行;网上很多例子无法运行,就是这个原因导致客户端和服务器无法握手成功;
websocket也有c++接口,linux下用命令
git clone git://git.warmcat.com/libwebsockets instead
完成后,这个installed目录下就是websocket的c++接口内容,test-server下有测试例子代码
websocket请求的例子
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
server的响应包包括:
◦处理请求包括处理GET 方法
◦验证Upgrader头域
◦验证Connection 头域
◦处理Sec-WebSocket-Key头域,方法见上;
◦处理Sec-WebSocket-Version
◦处理Origin头域,可选, 浏览器必须发送该头域
◦处理Sec-WebSocket-Protocol头域,可选
◦处理Sec-WebSocket-Extensions 头域,可选
◦处理其他头域,可选
◦Server 发送握手响应,这里只介绍服务器接受该连接情况下,包括:
◦http Status-Line
◦Upgrade 头域 ,值必须是"websocket"
◦Conntion头域,值必须是:“Upgrade”
◦Sec-WebSocket-Accept” 头域,该头域的值即处理Sec-WebSocket-Key" 域后的结果。
◦可选的"Sec-WebSocket-Protocol"头域
◦可选的"Sec-WebSocket-Extensions"头域
二、node.js和mysql
在node.js要使用mysql,必须安装mysql的扩展库:npm install mysql
下面的测试代码(js)
var Client = require('mysql').Client,
client = new Client();
client.password = 'mysql'; //密码
client.user = 'root'; //用户名
client.port = 5500; //mysql的端口
client.host = '211.23.5.1'; //这里要注意如果是ip不是域名,不想填写真实的ip,不能用localhost或127.0.0.1
var DATABASE_NAME = 'neekey_database',
TABLE_NAME = 'neekey_table';
//console.log(client.connect());
client.query('CREATE DATABASE '+ DATABASE_NAME, function(err) {
if (err && err.number != Client.ERROR_DB_CREATE_EXISTS) {
console.log(err);
throw err;
}
});
// If no callback is provided, any errors will be emitted as `'error'`
// events by the client
client.query('USE '+ DATABASE_NAME);
client.query(
'CREATE TABLE '+ TABLE_NAME +
'(id INT(11) AUTO_INCREMENT, '+
'title VARCHAR(255), '+
'text TEXT, '+
'created DATETIME, '+
'PRIMARY KEY (id))'
);
client.query(
'INSERT INTO '+ TABLE_NAME +' '+
'SET title = ?, text = ?, created = ?',
['super cool', 'this is a nice text', '2010-08-16 10:00:23']
);
var query = client.query(
'INSERT INTO '+ TABLE_NAME +' '+
'SET title = ?, text = ?, created = ?',
['another entry', 'because 2 entries make a better test', '2010-08-16 12:42:15']
);
client.query(
'SELECT * FROM '+ TABLE_NAME,
function selectCb(err, results, fields) {
if (err) {
throw err;
}
console.log(results);
console.log(fields);
client.end();
}
)
用node执行这个js就可以,注意js文件的路径,不能放到任意路径下,需要放到和node
同级目录下才可以,否则无法执行成功