一、node.js和websocket
node.js是個js的運行環(huán)境,封裝了對
GoogleV8引擎(應用于Google Chrome
瀏覽器);
websocket的握手是通過http協(xié)議來實現(xiàn)的,握手成功,下面就是websocket協(xié)議部分了,不是http了。
WebSocket 協(xié)議本質(zhì)上是一個基于 TCP 的協(xié)議。解決了Web Pages (Client) 和遠程主機的雙向通信問題
WebSocket API 規(guī)范由 W3C制定, WebSocket 協(xié)議規(guī)范由 IETF 制定 (RFC 6455)。是
HTML5一種新的協(xié)議下載安裝如下: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端口,可以正確的訪問到這個頁面;
在調(diào)試的時候要注意,服務器和客戶端要放在以前,原因就是在很多的例子,使用了socket.io這個node.js的擴展庫,
如果客戶端沒有這個,那是不行;網(wǎng)上很多例子無法運行,就是這個原因?qū)е驴蛻舳撕头掌鳠o法握手成功;
websocket也有c++接口,linux下用命令
git clone git://git.warmcat.com/libwebsockets instead
完成后,這個installed目錄下就是websocket的c++接口內(nèi)容,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頭域,可選, 瀏覽器必須發(fā)送該頭域
◦處理Sec-WebSocket-Protocol頭域,可選
◦處理Sec-WebSocket-Extensions 頭域,可選
◦處理其他頭域,可選
◦Server 發(fā)送握手響應,這里只介紹服務器接受該連接情況下,包括:
◦http Status-Line
◦Upgrade 頭域 ,值必須是"websocket"
◦Conntion頭域,值必須是:“Upgrade”
◦Sec-WebSocket-Accept” 頭域,該頭域的值即處理Sec-WebSocket-Key" 域后的結(jié)果。
◦可選的"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執(zhí)行這個js就可以,注意js文件的路徑,不能放到任意路徑下,需要放到和node
同級目錄下才可以,否則無法執(zhí)行成功