node.js的非常大的一個特點就是事件驅動,在開發服務器端服務的時候顯得非常方便。昨晚在新浪的@timYang也提到了node.js,估計新浪微博也注意到了它的優點。同時,淘寶最近也表示對node.js有相當的興趣。參見:http://www.tbdata.org/archives/1285 http://www.tbdata.org/archives/1292 ,為了體驗一把,就用node.js寫了一個透明的代理服務層,代碼如下:
復制代碼 代碼如下:
var net = require('net');
var proxyhost="127.0.0.1";//被代理的服務的IP
var proxyport=3306;//被代理的端口
var listenport=8124;//代理端口
net.createServer(function (socket) {
socket.on("connect",function(){
console.log('connected');
try{
var db=net.createConnection(proxyport,proxyhost);
db.on("connect",function(){
console.log("server connected");
socket.on("data", function (data) {
db.write(data);
});
db.on("data",function(data){
console.log(data.toString('utf8',0,data.legnth));
//console.log(data);
socket.write(data);
});
socket.on("close",function(){
console.log("server closed");
db.destroy();
});
});
db.on("error",function(data){
console.log("error:\r\n"+data);
});
db.on("end",function(){
console.log("server closed");
socket.destroy();
});
}catch(err){
console.log(err);
}
});
}).listen(listenport, "0.0.0.0");
//用於測試,生產環境需考慮穩定性代碼處理
OK,大功告成,只用了一點點的時間,是的,就是這麼簡單。我們把proxyhost,proxyport=3306改成本機的一個數據上,啟動後,我用mysql客戶端連8124,就可以連上3306端口的數據庫了。
不僅僅是數據庫,把proxyhost,proxyport指向到memcached,那麼就變成memcached代理了。
通過console.log你可以非常方便的調試協議。也可以用來監視某些不開放的協議。
使用node.js開發網絡服務應用程序,比如代理層,httpserver處理非常方便。
剛剛有朋友提出了一個 bug ,謝謝這位朋友。