[NodeJS] NodeJs Socket Server & Socket Client

大概是寫 Socket Server 寫上癮了

這次來寫如何用 NodeJS 來製作一個簡易的 Socket Server

由於 NodeJS 是天生就是為 Web 設計的, 所以他要做出 Socket Server 是再簡單也不過了

官方手冊: http://nodejs.org/api/net.html

官方已經寫得很好了, 我順便給予一個超級簡易的範例

Socket Server

首先要使用 socket service, 要先載入 NodeJS 的 net module

那因為要 socket service 服務, 很自然的我們也要設定一下要啟動在哪個 port

var net = require('net');
var PORT = 19850;

而使用 net 啟動 socket server 很簡單, 用 createServer method 就可以了, 相當容易

要注意的是, 因為NodeJS 是一個 event-driven 的環境, 所以我們特別設定了兩件事情

1. 如果 client 傳資料(data), 我就用 sock.on('data', callback) 來接收跟處理資料

2. 如果 client 離開(end), 我就用 sock.on('end', callback) 來處理

而我也順便印出連上來的 client 的基本資訊(這些東西在官網的 api 說明都可以查到)

而處理 client 傳過來的資料也只是回傳回去給他而已, 沒做甚麼事情

var server = net.createServer(function(sock) { 
    console.log('server is connected by:' + sock.remoteAddress + ':' + sock.remotePort);

    sock.on('data', function(data) {            
        sock.write(data);
    }); 

    sock.on('end', function() {
        console.log('client disconnected');
    });
        
});

最後就是啟動服務啦, 用 listen method 去啟動即可

作法相當容易, 且參數依據是 port, host, callback function, 這邊順便印出 server 資訊

如果今天想要架設的是 IPv6, host 參數可以改成 '::1'

IPv4

server.listen(PORT, '127.0.0.1', function() {
    address = server.address();
    console.log("opened server on %j", address);
});

IPv6

server.listen(PORT, '::1', function() {
    address = server.address();
    console.log("opened server on %j", address);
});

這邊放個完整程式碼

var net = require('net');
var PORT = 19850;

var server = net.createServer(function(sock) { 
    console.log('server is connected by:' + sock.remoteAddress + ':' + sock.remotePort);       // print client information

    sock.on('data', function(data) {    
        sock.write(data);
    }); 

    sock.on('end', function() {
        console.log('client disconnected');
    }); 
            
});

server.listen(PORT, '127.0.0.1', function() {
    address = server.address();
    console.log("opened server on %j", address);
});


那測試也很簡單
telnet localhost 19850

就可以測試看看了

Socket Server IPv4 & IPv6

這邊其實我有發現一個問題, 這個機制下我找不到可以讓 IPv4 and IPV6 共存的機制

只好手動改一下設計方法

將 createServer 後面的 function 獨立出來, 然後用參數的方式傳入 createServer, 這樣開兩個 Scoket Service 就可以了

完整程式碼如下, 這樣就可以用
telnet localhost 19850

or
telnet ::1 19850

來測試

var net = require('net');
var PORT = 19850;

var service = function(sock) { 
    console.log('server is connected by:' + sock.remoteAddress + ':' + sock.remotePort);

    sock.on('data', function(data) {    
        sock.write(data);
    }); 

    sock.on('end', function() {
        console.log('client disconnected');
    }); 
    
};

var server4 = net.createServer(service);
server4.listen(PORT, '127.0.0.1', function() { 
    address = server4.address();
    console.log("opened server on %j", address);
});

var server6 = net.createServer(service);
server6.listen(PORT, '::1', function() {
    address = server6.address();
    console.log("opened server on %j", address);
});

大功告成

既然 Server 都說了, 就順道列一下 Client 的作法, 相當相當的簡單

Socket Client

使用的 module 也是 net

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 19850;

首先先 new 一個 Socket

var client = new net.Socket();

然後要連線到 Server 端, 用 connect method 即可, 參數是要連線的 Port, Host, callback function

callback function 只是印出連線到的 server 跟順便傳訊息跟 server 說 hello

client.connect(PORT, HOST, function() {
    console.log('You connect to: ' + HOST + ':' + PORT);
    client.write('hello\r\n');
});

那如果 Server 回傳訊息要怎麼辦勒? 用 on('data', callback function) 來接收就可以了

下面程式碼會把收到的訊息(data) 印出來, 然後就自殺了XDDD (destroy)

client.on('data', function(data) {
    console.log('Return from server: ' + data);
    client.destroy();
});

完整程式碼如下

var net = require('net');

var HOST = '127.0.0.1';
var PORT = 19850;

var client = new net.Socket();

client.connect(PORT, HOST, function() {
    console.log('You connect to: ' + HOST + ':' + PORT);
    client.write('hello\r\n');
});

client.on('data', function(data) {
    console.log('Return from server: ' + data);
    client.destroy();
});

相當的沒有難度阿 #

註: NodeJS 是 single thread

留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server