小知识: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();
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:rhs和rhsa文件属性的文件删除方法

2023-4-26 11:46:55

建站知识

小知识:lamp主机是什么 vps如何配置lamp主机

2023-4-26 12:01:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索