Nodejs創(chuàng)建TCP服務(wù)器 - king0222
1.Nodejs提供了net模塊給我們,所以我們創(chuàng)建TCP服務(wù)器很簡單:
require('net').createServer(function(socket) {
// new connection
socket.on('data', function(data) {
// got data
});
socket.on('end', function(data) {
// connection closed
});
socket.write('Some string');
}).listen();
通過var server = require('net').createServer();這行代碼我們可以得到tcp服務(wù)器對象的引用。
server對象具注冊了以下幾個監(jiān)聽事件:
listening,connection,close,error
下面一個例子是在TCP服務(wù)器的聲明周期中監(jiān)聽了如上幾個事件:
var server = require('net').createServer();
var port = ;
server.on('listening', function() {
console.log('Server is listening on port', port);
});
server.on('connection', function(socket) {
console.log('Server has a new connection');
socket.end();
server.close();
});
server.on('close', function() {
console.log('Server is now closed');
});
server.on('error', function(err) {
console.log('Error occurred:', err.message);
});
server.listen(port);
一旦建立連接成功后,會得到一個socket對象作為回調(diào)中的參數(shù),我們可以操作這個socket對象,前面提到過tcp連接的對象是可讀可寫的流。作為一個流對象,因此能夠監(jiān)聽data,end等事件;作為一個可寫流,具有write()方法。 下面是一個能夠監(jiān)聽用戶輸入的例子:
var server = require('net').createServer(function(socket) {
console.log('new connection');
socket.setEncoding('utf');
socket.write("Hello! You can start typing. Type 'quit' to exit.\n");
socket.on('data', function(data) {
console.log('got:', data.toString())
if (data.trim().toLowerCase() === 'quit') {
socket.write('Bye bye!');
return socket.end();
}
//反饋回客戶端
socket.write(data);
});
socket.on('end', function() {
console.log('Client connection ended');
});
}).listen();
因為socket對象又是一個可讀的流,因此你能夠空氣他的pause()和resume(),或者你可以直接使用pipe()方法輸出一個可寫流:
var ws = require('fs').createWriteStream('helloworld.txt');
require('net').createServer(function(socket) {
socket.pipe(ws);
}).listen();
上面的代碼創(chuàng)建了一個可寫流對象,然后將這個可寫流對象輸出到客戶端。在客戶端可以得到一個名為helloworld.txt的文件,
可以用“telnet localhost 4001”來測試該例子。
因為socket對象同時具有可讀流的性質(zhì)和可寫流的性質(zhì),因此上面的例子你可以反過來形成下面這樣的代碼:
require('net').createServer(function(socket) {
var rs = require('fs').createReadStream('hello.txt');
rs.pipe(socket);
}).listen();
上面的代碼將hello.text文件內(nèi)容輸出到socket對象中返回給客戶端,當內(nèi)容輸出完成后,tcp連接就會退出,在前面的文章中有說過Pipe的用法,默認情況下在數(shù)據(jù)讀取完成后就會執(zhí)行end方法,因此如果不想要這樣的效果并保持連接的話可以在pipe中添加第二個參數(shù):{ end : false },并重寫end監(jiān)聽。
2.閑置socket 當有閑置的socket出現(xiàn)的時候我們需要進行相應(yīng)的清除的工作,由setTimeout方法可以幫我們把閑置的socket對象關(guān)閉。
var timeout = ; // minute
socket.setTimeout(timeout);
socket.on('timeout', function() {
socket.write('idle timeout, disconnecting, bye!');
socket.end();
});
下面是一個更簡潔的使用方式:
socket.setTimeout(60000, function() {
socket.end('idle timeout, disconnecting, bye!');
});
3.保持連接
socket.setKeepAlive(true);
你也可以添加第二個參數(shù)在設(shè)置可延時時長:
socket.setKeepAlive(true, 10000); // 10 seconds
4.是否使用延時
kernel會在發(fā)送tcp數(shù)據(jù)包之前緩存數(shù)據(jù),因此會占據(jù)一定的延時,這對于某些小數(shù)據(jù)包場景來說是有用的,但如果你不希望有這樣的延時的話,那么你可以這樣設(shè)置:
socket.setNoDelay(true);
var port = ;
var host = '...';
server.listen(port, host);
listen方法的第二個參數(shù)是監(jiān)聽客戶端的ip地址,如果填寫則只監(jiān)聽所填寫的ip,否則則監(jiān)聽所有ip地址,默認情況下不填寫。 關(guān)閉服務(wù)器連接,我們可以使用close方法,同時也可以對該事件進行監(jiān)聽。
server.close();
server.on('close', function() {
console.log('server closed!');
});
6.創(chuàng)建一個簡單的TCP聊天室服務(wù)器
var net = require('net');
var server = net.createServer();
var sockets = [];
server.on('connection', function(socket) {
console.log('got a new connection');
sockets.push(socket);
console.log('sockets length:', sockets.length);
socket.on('data', function(data) {
console.log('got data:', data.toString());
sockets.forEach(function(otherSocket) {
if (otherSocket !== socket) {
otherSocket.write(data);
}
});
});
socket.on('close', function() {
console.log('connection closed');
var index = sockets.indexOf(socket);
sockets.splice(index, );
console.log('sockets length:', sockets.length);
});
});
server.on('error', function(err) {
console.log('Server error:', err.message);
});
server.on('close', function() {
console.log('Server closed');
});
server.listen();
相關(guān)文章
aws服務(wù)器更換實例規(guī)格后ssh無法登陸的解決方案
這篇文章主要介紹了aws服務(wù)器更換實例規(guī)格后ssh無法登陸,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
vscode 遠程服務(wù)器 上傳至 github的操作步驟
這篇文章主要介紹了vscode 遠程服務(wù)器 上傳至 github的操作步驟,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-12-12
詳解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件
這篇文章主要介紹了詳解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
php.ini 啟用disable_functions提高安全
如果想保證服務(wù)器的安全,請將這個函數(shù)加到disable_functions里或者將安全模式打開吧,在安全模式下dl函數(shù)是無條件禁止的2009-07-07
使用SSH遠程連接Ubuntu服務(wù)器系統(tǒng)的方法
這篇文章主要介紹了使用SSH遠程連接Ubuntu服務(wù)器系統(tǒng),本教程是為了配置ssh服務(wù),可以將Ubuntu系統(tǒng)遠程通過cmd或者windows Powershell登錄,就可以實現(xiàn)代碼復制功能,需要的朋友可以參考下2023-11-11

