nodejs模塊——網絡編程模塊


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有問題歡迎與我討論,共同進步。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM