Node.js开发之套接字(socket)编程入门示例
本文实例讲述了Node.js套接字(socket)编程。分享给大家供大家参考,具体如下:
Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议。这次我们看一个简单的回显服务器示例,包括服务端和客户端的代码。
代码
分服务器和客户端两部分来说吧。
server代码分析
server.js:
varnet=require("net"); //serverisaninstanceofnet.Server //sockisaninstanceofnet.Socket varserver=net.createServer(function(sock){ console.log('clientconnected,address-',sock.remoteAddress,'port-',sock.remotePort); sock.setEncoding('utf8'); sock.on('data',function(data){ console.log('gotdatafromclient-',data); sock.write(data); }); sock.on('end',function(){ console.log('clientdisconnected'); }); sock.on('error',function(err){ console.log('socketerror-',err); }); }); server.maxConnections=10; server.listen(7,function(){ console.log('echoserverboundatport-7'); });
使用net.createServer来创建一个服务器实例,这个方法的返回值是一个net.Server实例,net.Server提供了listen方法,让我们监听到某个端口上来接受客户端连接,同时还提供了一些属性,比如maxConnections可以设置服务器的并发连接数上限(当服务器的连接数超过这个值时,后续连接就会被拒掉),还有其它的,看文档吧:https://nodejs.org/api/net.html#net_class_net_server。
net.Server还提供了一些事件,比如error、connection等。当有客户端连接被接受时,会发射connection事件,这个事件带一个net.Socket对象作为参数,可以在回调函数里访问这个net.Socket实例来与客户端交互。我在代码里,给createServer方法传入了一个callback来处理connection事件,实际上也可以略作修改,通过监听connection事件的方法处理客户端连接。新代码如下:
varnet=require("net"); varserver=net.createServer(); server.on('connection',function(sock){ console.log('clientconnected,address-',sock.remoteAddress,'port-',sock.remotePort); sock.setEncoding('utf8'); sock.on('data',function(data){ console.log('gotdatafromclient-',data); sock.write(data); }); sock.on('end',function(){ console.log('clientdisconnected'); }); sock.on('error',function(err){ console.log('socketerror-',err); }); }); server.maxConnections=10; server.listen(7,function(){ console.log('echoserverboundatport-7'); });
效果是一样的。
net.Socket对象有一些方法,比如write可以写数据。还有一些事件,比如error、end、data等,看代码就能明白用法。还有一些属性,比如remoteAddress、remotePort。
client代码分析
client.js:
varnet=require("net"); varreadline=require('readline'); console.log('type"exit"or"quit"toquit.'); //sockisaninstanceofnet.Socket varsock=net.connect({port:7},function(){ console.log('serverconnected'); sock.setEncoding('utf8'); sock.write('HelloEchoServer\r\n'); }); sock.on('data',function(data){ console.log('gotdatafromserver-',data); }); sock.on('end',function(){ console.log('clientdisconnected'); }); sock.on('error',function(err){ console.log('socketerror-',err); }); sock.on('close',function(){ console.log('echoclientwasclosed'); process.exit(0); }); varrl=readline.createInterface({ input:process.stdin }); functionquitEcho(){ rl.close(); sock.end(); console.log('quitechoclient'); } rl.on('line',function(cmd){ if(cmd.indexOf('quit')==0||cmd.indexOf('exit')==0){ quitEcho(); }else{ sock.write(cmd+'\r\n'); } }); rl.on('SIGINT',quitEcho);
调用readline模块来从标准输入读取数据来发送给客户端。readline的文档在这里:https://nodejs.org/api/readline.html。正如它的名字,Readline可以让你一行一行的读取一个流。比较常见的就是读取标准输入流。Readline有一些事件,我们用到的“line”事件,在一行数据就绪时会发射,带一个代表数据的参数。监听line事件,在回调中调用net.Socket的write方法写入数据。当你在控制台输入“quit”或“exit”时,调用quitEcho退出。
net.connect方法可以连接到指定的服务器,它的原型如下:
net.connect(options[,connectionListener])
第一个参数是Object,用于指定和连接相关的选项,比如服务端的host、port等,如果不指定host,就默认用localhost作为服务端主机名.
net.connect返回net.Socket对象,一旦拿到了Socket实例,就可以用net.Socket来为所欲为了。监听了data事件来接收服务端发挥的数据,监听close事件来退出进程。net.Socket的具体API,参考https://nodejs.org/api/net.html#net_class_net_socket。
希望本文所述对大家node.js程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。