net模塊提供了一個異步網絡包裝器,用於TCP網絡編程,它包含了創建服務器和客戶端的方法。dgram模塊用於UDP網絡編程。
參考鏈接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html
一、TCP Server
net模塊通過net.createServer方法創建TCP服務器,通過net.connect方法創建客戶端去連接服務器。
1、通過net模塊創建一個TCP Server
// server.js var net = require('net'); // 創建TCP服務器 var server = net.createServer(function(socket) { console.log('client connected'); // 監聽客戶端的數據 socket.on('data', function(data) { console.log('server got data from client: ', data.toString()); }); // 監聽客戶端斷開連接事件 socket.on('end', function(data) { console.log('connection closed'); }); // 發送數據給客戶端 socket.write('Hello\r\n'); }); // 啟動服務 server.listen(8080, function() { console.log('server bound'); });
2、創建一個客戶端
// client.js var net = require('net'); // 連接服務器 var client = net.connect({port: 8080}, function() { console.log('connected to server'); client.write('World!\r\n'); }); // 接收服務端的數據 client.on('data', function(data) { console.log('client got data from server: ', data.toString()); // 斷開連接 client.end(); }); // 斷開連接 client.on('end', function() { console.log('disconnected from server'); });
在一個終端運行TCP服務器代碼,另一個終端運行TCP客戶端代碼,結果如下:
二、簡易聊天室服務器
1、簡易聊天室服務端
首先創建TCP服務器;然后是接收客戶端連接請求;獲取客戶端發送過來的數據;允許多個客戶端同時連接,所以需要接收所有的用戶連接;服務器廣播數據,把來自客戶端的數據轉發送給其他所有客戶端;最后把關閉連接的客戶端從服務器廣播列表中給刪除掉。
// chatServer.js var net = require('net'); //第一步 創建TCP服務器 var server = net.createServer(); // 存儲所有客戶端socket //第四步,服務器接收所有的用戶連接
var sockets = [];
//第二步 接收客戶端請求 server.on('connection', function(socket) { console.log('Got a new connection'); //第五步,服務器廣播數據 sockets.push(socket); //第三步,獲取客戶端發送過來的數據 socket.on('data', function(data) { console.log('Got data: ', data); sockets.forEach(function(otherSocket) { if (otherSoecket !== socket) { otherSocket.write(data); } }); ]); // 第六步,關閉連接客戶端從服務器廣播列表刪除 socket.on('close', function() { console.log('A client connection closed'); var index = sockets.indexOf(socket); sockets.splice(index, 1); }); }); server.on('error', function(err) { console.log('Server error: ', err.message); }); server.on('close', function() { console.log('Server closed'); }); server.listen(8080);
2、簡易聊天室客戶端
先解釋process模塊
process模塊是Node.js的一個全局模塊,可以在任何地方直接使用而無需通過require方法引入。process模塊允許獲得或修改當前Node.js進程的設置。
process.stdin用於獲取來自標准輸入的可讀流(Readable Stream)。
客戶端代碼
// chatClient.js var net = require('net'); process.stdin.resume(); process.stdin.setEncoding('utf8'); var client = net.connect({ port: 8080 }, function() { console.log('Connected to server'); // 獲取輸入的字符串 console.log('input: '); process.stdin.on('data', function(data) { // 發送輸入的字符串到服務器 console.log('input: '); client.write(data); // 輸入 'close' 字符串時關閉連接 if (data === 'close\n') { client.end(); } }); }); // 獲取服務端發送過來的數據 client.on('data', function(data) { console.log('Other user\'s input', data.toString()); }); client.on('end', function() { console.log('Disconnected from server'); // 退出客戶端程序 process.exit(); });
一個終端窗口執行$ node chatServer.js運行服務器代碼。
另外兩個終端窗口執行$ node chatClient.js運行客戶端代碼。
結果如下:
三、UDP編程
UDP通過dgram.createSocket創建服務。
1、服務器端代碼
// udpServer.js var dgram = require("dgram"); var server = dgram.createSocket("udp4"); server.on("error", function(err) { console.log("server error:\n" + err.stack); server.close(); }); // 接收來自客戶端的消息 server.on("message", function(msg, rinfo) { console.log("server got: " + msg.toString() + " from " + rinfo.address + ":" + rinfo.port); }); // 監聽服務 server.on("listening", function() { var address = server.address(); console.log("server listening on " + address.address + ":" + address.port); }); server.bind(41234); // server listening 0.0.0.0:41234
2、客戶端
發送消息必須通過Buffer創建。
// udpClient.js var dgram = require('dgram'); var client = dgram.createSocket('udp4'); var message = new Buffer('hello shiyanlou'); client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) { client.close(); });
運行結果如下
四、排錯
1、Error: connect ECONNREFUSED 127.0.0.1:8080
服務器端口沒開。
本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/5056519.html有問題歡迎與我討論,共同進步。