最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs創(chuàng)建TCP服務(wù)器 - king0222

 更新時(shí)間:2015年09月24日 15:16:26   投稿:mrr  
這篇文章主要介紹了Nodejs創(chuàng)建TCP服務(wù)器 - king0222的相關(guān)資料,需要的朋友可以參考下

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ù)器對(duì)象的引用。

server對(duì)象具注冊(cè)了以下幾個(gè)監(jiān)聽事件:

listening,connection,close,error

下面一個(gè)例子是在TCP服務(wù)器的聲明周期中監(jiān)聽了如上幾個(gè)事件:

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);

一旦建立連接成功后,會(huì)得到一個(gè)socket對(duì)象作為回調(diào)中的參數(shù),我們可以操作這個(gè)socket對(duì)象,前面提到過tcp連接的對(duì)象是可讀可寫的流。作為一個(gè)流對(duì)象,因此能夠監(jiān)聽data,end等事件;作為一個(gè)可寫流,具有write()方法。 下面是一個(gè)能夠監(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();

因?yàn)閟ocket對(duì)象又是一個(gè)可讀的流,因此你能夠空氣他的pause()和resume(),或者你可以直接使用pipe()方法輸出一個(gè)可寫流:

 var ws = require('fs').createWriteStream('helloworld.txt');
 require('net').createServer(function(socket) {
   socket.pipe(ws);
 }).listen();

上面的代碼創(chuàng)建了一個(gè)可寫流對(duì)象,然后將這個(gè)可寫流對(duì)象輸出到客戶端。在客戶端可以得到一個(gè)名為helloworld.txt的文件,

可以用“telnet localhost 4001”來測試該例子。

因?yàn)閟ocket對(duì)象同時(shí)具有可讀流的性質(zhì)和可寫流的性質(zhì),因此上面的例子你可以反過來形成下面這樣的代碼:

 require('net').createServer(function(socket) {
   var rs = require('fs').createReadStream('hello.txt');
   rs.pipe(socket);
 }).listen();

上面的代碼將hello.text文件內(nèi)容輸出到socket對(duì)象中返回給客戶端,當(dāng)內(nèi)容輸出完成后,tcp連接就會(huì)退出,在前面的文章中有說過Pipe的用法,默認(rèn)情況下在數(shù)據(jù)讀取完成后就會(huì)執(zhí)行end方法,因此如果不想要這樣的效果并保持連接的話可以在pipe中添加第二個(gè)參數(shù):{ end : false },并重寫end監(jiān)聽。

2.閑置socket 當(dāng)有閑置的socket出現(xiàn)的時(shí)候我們需要進(jìn)行相應(yīng)的清除的工作,由setTimeout方法可以幫我們把閑置的socket對(duì)象關(guān)閉。

 var timeout = ; // minute
 socket.setTimeout(timeout);
 socket.on('timeout', function() {
   socket.write('idle timeout, disconnecting, bye!');
   socket.end();
 });

下面是一個(gè)更簡潔的使用方式:

 socket.setTimeout(60000, function() {
   socket.end('idle timeout, disconnecting, bye!');
 });

3.保持連接

復(fù)制代碼 代碼如下:

socket.setKeepAlive(true);

你也可以添加第二個(gè)參數(shù)在設(shè)置可延時(shí)時(shí)長:

復(fù)制代碼 代碼如下:

socket.setKeepAlive(true, 10000); // 10 seconds

4.是否使用延時(shí)

kernel會(huì)在發(fā)送tcp數(shù)據(jù)包之前緩存數(shù)據(jù),因此會(huì)占據(jù)一定的延時(shí),這對(duì)于某些小數(shù)據(jù)包場景來說是有用的,但如果你不希望有這樣的延時(shí)的話,那么你可以這樣設(shè)置:

復(fù)制代碼 代碼如下:

socket.setNoDelay(true);

 var port = ;
 var host = '...';
 server.listen(port, host);

listen方法的第二個(gè)參數(shù)是監(jiān)聽客戶端的ip地址,如果填寫則只監(jiān)聽所填寫的ip,否則則監(jiān)聽所有ip地址,默認(rèn)情況下不填寫。 關(guān)閉服務(wù)器連接,我們可以使用close方法,同時(shí)也可以對(duì)該事件進(jìn)行監(jiān)聽。

復(fù)制代碼 代碼如下:

 server.close();
 server.on('close', function() {
     console.log('server closed!');
 });

6.創(chuàng)建一個(gè)簡單的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ù)器更換實(shí)例規(guī)格后ssh無法登陸的解決方案

    aws服務(wù)器更換實(shí)例規(guī)格后ssh無法登陸的解決方案

    這篇文章主要介紹了aws服務(wù)器更換實(shí)例規(guī)格后ssh無法登陸,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • vscode 遠(yuǎn)程服務(wù)器 上傳至 github的操作步驟

    vscode 遠(yuǎn)程服務(wù)器 上傳至 github的操作步驟

    這篇文章主要介紹了vscode 遠(yuǎn)程服務(wù)器 上傳至 github的操作步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • 使用RSYNC在服務(wù)器間鏡像或者備份目錄和文件

    使用RSYNC在服務(wù)器間鏡像或者備份目錄和文件

    rsync是個(gè)真正的鏡像工具,它能相應(yīng)地刪除本地文件萬一服務(wù)器上的文件被刪除,這一點(diǎn)比wget好,在鏡像目錄的同時(shí)也能排除某些目錄及文件。速度非???
    2010-03-03
  • 詳解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件

    詳解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件

    這篇文章主要介紹了詳解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • php.ini 啟用disable_functions提高安全

    php.ini 啟用disable_functions提高安全

    如果想保證服務(wù)器的安全,請(qǐng)將這個(gè)函數(shù)加到disable_functions里或者將安全模式打開吧,在安全模式下dl函數(shù)是無條件禁止的
    2009-07-07
  • Windows下安裝squid的步驟詳解

    Windows下安裝squid的步驟詳解

    squid軟件一般常用于代理中,也是最常見的代理軟件,在linux下配置squid以前已經(jīng)說過了,下面介紹下Windows下安裝squid已經(jīng)配置的詳細(xì)方法
    2012-09-09
  • DNSlog外帶原理及注入分析(最新推薦)

    DNSlog外帶原理及注入分析(最新推薦)

    DNS的全稱是Domain?Name?System(網(wǎng)絡(luò)名稱系統(tǒng)),它作為將域名和IP地址相互映射,使人更方便地訪問互聯(lián)網(wǎng),最近一直聽到DNSlog外帶原理等詞但對(duì)其原理一直只是自己的理解(回顯DNS請(qǐng)求后的日志)并沒有真正的了解過,所以這里做一下記錄,感興趣的朋友一起看看吧
    2024-01-01
  • 使用SSH遠(yuǎn)程連接Ubuntu服務(wù)器系統(tǒng)的方法

    使用SSH遠(yuǎn)程連接Ubuntu服務(wù)器系統(tǒng)的方法

    這篇文章主要介紹了使用SSH遠(yuǎn)程連接Ubuntu服務(wù)器系統(tǒng),本教程是為了配置ssh服務(wù),可以將Ubuntu系統(tǒng)遠(yuǎn)程通過cmd或者windows Powershell登錄,就可以實(shí)現(xiàn)代碼復(fù)制功能,需要的朋友可以參考下
    2023-11-11
  • Mac安裝Homebrew的那些事兒

    Mac安裝Homebrew的那些事兒

    Homebrew是Mac Os的包管理工具,相當(dāng)于Redhat Linux(Centos/RHEL/Fedora)的yum或者Debian Linux(Debian/Ubuntu)的apt-get。這篇文章主要介紹了Mac安裝Homebrew的那些事兒 ,需要的朋友可以參考下
    2019-08-08
  • git修改和刪除功能_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    git修改和刪除功能_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了git修改和刪除功能,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

报价| 济阳县| 临沂市| 新干县| 漠河县| 庄浪县| 鲁甸县| 桓台县| 宣威市| 普兰店市| 南郑县| 桐柏县| 神池县| 京山县| 肇东市| 忻城县| 密山市| 上栗县| 文山县| 永清县| 五河县| 梁平县| 酉阳| 烟台市| 邻水| 亚东县| 福海县| 新宾| 讷河市| 梨树县| 徐汇区| 泰和县| 怀宁县| 南安市| 鸡东县| 鄂托克前旗| 盐池县| 龙里县| 韶关市| 平和县| 化德县|