Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作。让我们用Node实现有多么简单,并且还能轻松扩展。
创建一个TCP服务器
var net = require('net'); var chatServer = net.createServer(); chatServer.on("connection", function(client) { client.write('Hi! '); client.on('data', function(data) { console.log(data); }); }); chatServer.listen(9000);
我们用Telnet 连接上localhost:9000,向服务器发送hi,Node显示出一堆二进制的数据,原来Javascript无法很好的处理的二进制数据,所以引入Buffer库来处理。
客户端互相发送消息
var net = require('net'); var chatServer = net.createServer(); clientList = []; chatServer.on("connection", function(client) { client.write('Hi! '); client.name = client.remoteAddress + ":" + client.remotePort; client.write('Hi' + client.name + ' '); clientList.push(client); client.on('data', function(data) { broadcast(data, client); }); }); function broadcast(msg, client) { for (var i = 0, clen = clientList.length; i < clen; i++) { if (client !== clientList[i]) { clientList[i].write(client.name + " says " + msg + " "); } } } chatServer.listen(9000);
当我们断开其中的一个客户端的话,服务器会报如下错误:
检查socket可写状态将程序变得更健壮
var net = require('net'); var chatServer = net.createServer(); clientList = []; chatServer.on("connection", function(client) { client.write('Hi! '); client.name = client.remoteAddress + ":" + client.remotePort; client.write('Hi' + client.name + ' '); clientList.push(client); client.on('data', function(data) { broadcast(data, client); }); //客户端退出 client.on('end', function() { console.log(client.name + " quit"); clientList.splice(clientList.indexOf(client), 1); }); }); function broadcast(msg, client) { var cleanup = []; for (var i = 0, clen = clientList.length; i < clen; i++) { if (client !== clientList[i]) { //检查socket是否可写 if (clientList[i].writable) { clientList[i].write(client.name + " says " + msg + " "); } else { cleanup.push(clientList[i]); clientList[i].destroy(); //对断开连接的socket进行销毁 } } } //在写入循环中删除死节点,消除垃圾索引 for (var i = 0, clenuplen = cleanup.length; i < clenuplen; i++) { clientList.splice(clientList.indexOf(cleanup[i]), 1); } } chatServer.listen(9000);
记录错误日志
//记录错误日志 client.on('error', function(e) { console.log(e); })
为client对象添加error事件后,客户端发生的任何错误都会被记录下来。