经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
Node.js开发之套接字(socket)编程入门示例
来源:jb51  时间:2019/11/5 12:44:48  对本文有异议

本文实例讲述了Node.js套接字(socket)编程。分享给大家供大家参考,具体如下:

Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议。这次我们看一个简单的回显服务器示例,包括服务端和客户端的代码。

代码

分服务器和客户端两部分来说吧。

server代码分析

server.js:

  1. var net = require("net");
  2. // server is an instance of net.Server
  3. // sock is an instance of net.Socket
  4. var server = net.createServer(function(sock){
  5. console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort);
  6. sock.setEncoding('utf8');
  7. sock.on('data', function(data){
  8. console.log('got data from client - ', data);
  9. sock.write(data);
  10. });
  11. sock.on('end', function(){
  12. console.log('client disconnected');
  13. });
  14. sock.on('error', function(err){
  15. console.log('socket error - ', err);
  16. });
  17. });
  18. server.maxConnections = 10;
  19. server.listen(7, function(){
  20. console.log('echo server bound at port - 7');
  21. });
  22.  

使用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事件的方法处理客户端连接。新代码如下:

  1. var net = require("net");
  2. var server = net.createServer();
  3. server.on('connection', function(sock){
  4. console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort);
  5. sock.setEncoding('utf8');
  6. sock.on('data', function(data){
  7. console.log('got data from client - ', data);
  8. sock.write(data);
  9. });
  10. sock.on('end', function(){
  11. console.log('client disconnected');
  12. });
  13. sock.on('error', function(err){
  14. console.log('socket error - ', err);
  15. });
  16. });
  17. server.maxConnections = 10;
  18. server.listen(7, function(){
  19. console.log('echo server bound at port - 7');
  20. });
  21.  

效果是一样的。

net.Socket对象有一些方法,比如write可以写数据。还有一些事件,比如error、end、data等,看代码就能明白用法。还有一些属性,比如remoteAddress、remotePort。

client代码分析

client.js:

  1. var net = require("net");
  2. var readline = require('readline');
  3. console.log('type "exit" or "quit" to quit.');
  4. // sock is an instance of net.Socket
  5. var sock = net.connect({port: 7}, function(){
  6. console.log('server connected');
  7. sock.setEncoding('utf8');
  8. sock.write('Hello Echo Server\r\n');
  9. });
  10. sock.on('data', function(data){
  11. console.log('got data from server - ', data);
  12. });
  13. sock.on('end', function(){
  14. console.log('client disconnected');
  15. });
  16. sock.on('error', function(err){
  17. console.log('socket error - ', err);
  18. });
  19. sock.on('close', function(){
  20. console.log('echo client was closed');
  21. process.exit(0);
  22. });
  23. var rl = readline.createInterface({
  24. input: process.stdin
  25. });
  26. function quitEcho(){
  27. rl.close();
  28. sock.end();
  29. console.log('quit echo client');
  30. }
  31. rl.on('line', function(cmd){
  32. if(cmd.indexOf('quit') == 0 || cmd.indexOf('exit') == 0){
  33. quitEcho();
  34. }else{
  35. sock.write(cmd + '\r\n');
  36. }
  37. });
  38. rl.on('SIGINT', quitEcho);
  39.  

调用readline模块来从标准输入读取数据来发送给客户端。readline的文档在这里:https://nodejs.org/api/readline.html。正如它的名字,Readline可以让你一行一行的读取一个流。比较常见的就是读取标准输入流。Readline有一些事件,我们用到的“line”事件,在一行数据就绪时会发射,带一个代表数据的参数。监听line事件,在回调中调用net.Socket的write方法写入数据。当你在控制台输入“quit”或“exit”时,调用quitEcho退出。

net.connect方法可以连接到指定的服务器,它的原型如下:

  1. 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程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号