设为首页 收藏本站
查看: 904|回复: 0

[经验分享] Nodejs创建TCP服务器

[复制链接]

尚未签到

发表于 2017-2-22 12:34:26 | 显示全部楼层 |阅读模式
Nodejs创建TCP服务器
  1.Nodejs提供了net模块给我们,所以我们创建TCP服务器很简单:



1 require('net').createServer(function(socket) {
2     // new connection
3     socket.on('data', function(data) {
4         // got data
5     });
6     socket.on('end', function(data) {
7         // connection closed
8     });
9     socket.write('Some string');
10 }).listen(4001);
  通过var server = require('net').createServer();这行代码我们可以得到tcp服务器对象的引用。
server对象具注册了以下几个监听事件:
listening,connection,close,error
下面一个例子是在TCP服务器的声明周期中监听了如上几个事件:



1 var server = require('net').createServer();
2 var port = 4001;
3 server.on('listening', function() {
4     console.log('Server is listening on port', port);
5 });
6 server.on('connection', function(socket) {
7     console.log('Server has a new connection');
8     socket.end();
9     server.close();
10 });
11 server.on('close', function() {
12     console.log('Server is now closed');
13 });
14 server.on('error', function(err) {
15     console.log('Error occurred:', err.message);
16 });
17 server.listen(port);
  一旦建立连接成功后,会得到一个socket对象作为回调中的参数,我们可以操作这个socket对象,前面提到过tcp连接的对象是可读可写的流。作为一个流对象,因此能够监听data,end等事件;作为一个可写流,具有write()方法。
下面是一个能够监听用户输入的例子:



1 var server = require('net').createServer(function(socket) {
2     console.log('new connection');
3     socket.setEncoding('utf8');
4     socket.write("Hello! You can start typing. Type 'quit' to exit.\n");
5     socket.on('data', function(data) {
6         console.log('got:', data.toString())
7         if (data.trim().toLowerCase() === 'quit') {
8             socket.write('Bye bye!');
9             return socket.end();
10         }
11         //反馈回客户端
12         socket.write(data);
13     });
14     socket.on('end', function() {
15         console.log('Client connection ended');
16     });
17 }).listen(4001);
  因为socket对象又是一个可读的流,因此你能够空气他的pause()和resume(),或者你可以直接使用pipe()方法输出一个可写流:



1 var ws = require('fs').createWriteStream('helloworld.txt');
2 require('net').createServer(function(socket) {
3     socket.pipe(ws);
4 }).listen(4001);
  上面的代码创建了一个可写流对象,然后将这个可写流对象输出到客户端。在客户端可以得到一个名为helloworld.txt的文件,
可以用“telnet localhost 4001”来测试该例子。
因为socket对象同时具有可读流的性质和可写流的性质,因此上面的例子你可以反过来形成下面这样的代码:



1 require('net').createServer(function(socket) {
2     var rs = require('fs').createReadStream('hello.txt');
3     rs.pipe(socket);
4 }).listen(4001);
  上面的代码将hello.text文件内容输出到socket对象中返回给客户端,当内容输出完成后,tcp连接就会退出,在前面的文章中有说过Pipe的用法,默认情况下在数据读取完成后就会执行end方法,因此如果不想要这样的效果并保持连接的话可以在pipe中添加第二个参数:{ end : false },并重写end监听。
  2.闲置socket
当有闲置的socket出现的时候我们需要进行相应的清除的工作,由setTimeout方法可以帮我们把闲置的socket对象关闭。



1 var timeout = 60000; // 1 minute
2 socket.setTimeout(timeout);
3 socket.on('timeout', function() {
4     socket.write('idle timeout, disconnecting, bye!');
5     socket.end();
6 });
  下面是一个更简洁的使用方式:



1 socket.setTimeout(60000, function() {
2     socket.end('idle timeout, disconnecting, bye!');
3 });
  3.保持连接
socket.setKeepAlive(true);
你也可以添加第二个参数在设置可延时时长:
socket.setKeepAlive(true, 10000); // 10 seconds
  
4.是否使用延时
kernel会在发送tcp数据包之前缓存数据,因此会占据一定的延时,这对于某些小数据包场景来说是有用的,但如果你不希望有这样的延时的话,那么你可以这样设置:
socket.setNoDelay(true);
  
5.监听关闭连接



1 var port = 4001;
2 var host = '0.0.0.0';
3 server.listen(port, host);
  listen方法的第二个参数是监听客户端的ip地址,如果填写则只监听所填写的ip,否则则监听所有ip地址,默认情况下不填写。
关闭服务器连接,我们可以使用close方法,同时也可以对该事件进行监听。



1 server.close();
2 server.on('close', function() {
3     console.log('server closed!');
4 });
  6.创建一个简单的TCP聊天室服务器



1 var net = require('net');
2 var server = net.createServer();
3 var sockets = [];
4 server.on('connection', function(socket) {
5     console.log('got a new connection');
6     sockets.push(socket);
7     console.log('sockets length:', sockets.length);
8     socket.on('data', function(data) {
9         console.log('got data:', data.toString());
10         sockets.forEach(function(otherSocket) {
11             if (otherSocket !== socket) {
12                 otherSocket.write(data);
13             }
14         });
15     });
16     socket.on('close', function() {
17         console.log('connection closed');
18         var index = sockets.indexOf(socket);
19         sockets.splice(index, 1);
20         console.log('sockets length:', sockets.length);
21     });
22 });
23 server.on('error', function(err) {
24     console.log('Server error:', err.message);
25 });
26 server.on('close', function() {
27     console.log('Server closed');
28 });
29 server.listen(4001);
  7.常用插件
  7.1开发中可以安装supervisor来提高调试效率,这个插件可以保证我们每次修改完代码后都无需重新手动启动nodejs服务器,由supervisor帮我们自动搞定。
  npm install -g supervisor
  安装完成后可以: supervisor bin/www
  7.2在服务器环境中部署nodejs,我们不希望程序会断掉,因此,就需要一个能自动重启的服务来帮我们实现这一功能。

$ sudo npm install forever -g   #安装
$ forever start app.js          #启动
$ forever stop app.js           #关闭
$ forever start -l forever.log -o out.log -e err.log app.js   #输出日志和错误

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345772-1-1.html 上篇帖子: Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API 下篇帖子: NodeJS学习笔记(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表