激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - Nodejs創建TCP服務器

Nodejs創建TCP服務器

2020-08-27 17:57king0222 服務器知識

這篇文章主要介紹了Nodejs創建TCP服務器的相關資料,需要的朋友可以參考下

1.Nodejs提供了net模塊給我們,所以我們創建TCP服務器很簡單:

?
1
2
3
4
5
6
7
8
9
10
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服務器對象的引用。

server對象具注冊了以下幾個監聽事件:

listening,connection,close,error

下面一個例子是在TCP服務器的聲明周期中監聽了如上幾個事件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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對象作為回調中的參數,我們可以操作這個socket對象,前面提到過tcp連接的對象是可讀可寫的流。作為一個流對象,因此能夠監聽data,end等事件;作為一個可寫流,具有write()方法。 下面是一個能夠監聽用戶輸入的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()方法輸出一個可寫流:

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

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

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

因為socket對象同時具有可讀流的性質和可寫流的性質,因此上面的例子你可以反過來形成下面這樣的代碼:

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

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

2.閑置socket 當有閑置的socket出現的時候我們需要進行相應的清除的工作,由setTimeout方法可以幫我們把閑置的socket對象關閉。

?
1
2
3
4
5
6
var timeout = ; // minute
socket.setTimeout(timeout);
socket.on('timeout', function() {
  socket.write('idle timeout, disconnecting, bye!');
  socket.end();
});

下面是一個更簡潔的使用方式:

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

3.保持連接

 

復制代碼 代碼如下:

socket.setKeepAlive(true);

 

你也可以添加第二個參數在設置可延時時長:

 

復制代碼 代碼如下:

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

 

4.是否使用延時

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

 

復制代碼 代碼如下:

socket.setNoDelay(true);

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

 

listen方法的第二個參數是監聽客戶端的ip地址,如果填寫則只監聽所填寫的ip,否則則監聽所有ip地址,默認情況下不填寫。 關閉服務器連接,我們可以使用close方法,同時也可以對該事件進行監聽。

 

復制代碼 代碼如下:

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

 

6.創建一個簡單的TCP聊天室服務器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 一级毛片免费高清 | 美女久久久久 | 一级毛片手机在线观看 | 国产精品国产成人国产三级 | 成人一区二区在线观看视频 | 日韩色视频在线观看 | 最新日韩中文字幕 | www.17c亚洲蜜桃 | 欧美一级xxx| 免费看a级片 | 久久久电影电视剧免费看 | 久久爽精品区穿丝袜 | 精品国产91一区二区三区 | 91成人午夜性a一级毛片 | 免费三级大片 | 色婷婷综合久久久中字幕精品久久 | 精品成人免费一区二区在线播放 | 日日爱99| www.777含羞草 | 神马福利网 | 成人在线观看一区二区 | 成人激情视频网站 | 日本一区二区不卡高清 | 九九看片 | 性爱视频在线免费 | 亚洲一区二区免费视频 | 久久精品综合视频 | 综合网日日天干夜夜久久 | 欧美成人理论片乱 | 99亚洲视频| 99在线在线视频免费视频观看 | 国产日韩免费观看 | 成人黄色网战 | 色中色在线视频 | 久久性生活免费视频 | 一级免费在线 | 永久免费av片在线观看全网站 | 亚洲一区在线视频 | 一区二区久久精品66国产精品 | av在线播放免费观看 | 日本欧美一区二区 |