Node.js开发之套接字(socket)编程入门示例


Posted in Javascript onNovember 05, 2019

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

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

代码

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

server代码分析

server.js:

var net = require("net");
// server is an instance of net.Server
// sock is an instance of net.Socket
var server = net.createServer(function(sock){
 console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort);
 sock.setEncoding('utf8');
 sock.on('data', function(data){
  console.log('got data from client - ', data);
  sock.write(data);
 });
 sock.on('end', function(){
  console.log('client disconnected');
 });
 sock.on('error', function(err){
  console.log('socket error - ', err);
 });
});
server.maxConnections = 10;
server.listen(7, function(){
 console.log('echo server bound at port - 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事件的方法处理客户端连接。新代码如下:

var net = require("net");
var server = net.createServer();
server.on('connection', function(sock){
 console.log('client connected, address - ', sock.remoteAddress, ' port - ', sock.remotePort);
 sock.setEncoding('utf8');
 sock.on('data', function(data){
  console.log('got data from client - ', data);
  sock.write(data);
 });
 sock.on('end', function(){
  console.log('client disconnected');
 });
 sock.on('error', function(err){
  console.log('socket error - ', err);
 });
});
server.maxConnections = 10;
server.listen(7, function(){
 console.log('echo server bound at port - 7');
});

效果是一样的。

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

client代码分析

client.js:

var net = require("net");
var readline = require('readline');
console.log('type "exit" or "quit" to quit.');
// sock is an instance of net.Socket
var sock = net.connect({port: 7}, function(){
 console.log('server connected');
 sock.setEncoding('utf8');
 sock.write('Hello Echo Server\r\n');
});
sock.on('data', function(data){
 console.log('got data from server - ', data);
});
sock.on('end', function(){
 console.log('client disconnected');
});
sock.on('error', function(err){
 console.log('socket error - ', err);
});
sock.on('close', function(){
 console.log('echo client was closed');
 process.exit(0);
});
var rl = readline.createInterface({
 input: process.stdin
});
function quitEcho(){
 rl.close();
 sock.end();
 console.log('quit echo client');
}
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程序设计有所帮助。

Javascript 相关文章推荐
关于文本限制字数的js代码
Apr 02 Javascript
javascript 显示当前系统时间代码
Dec 28 Javascript
可以将word转成html的js代码
Apr 11 Javascript
jQuery 打造动态下滑菜单实现说明
Apr 15 Javascript
json格式化/压缩工具 Chrome插件扩展版
May 25 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
$.extend 的一个小问题
Jun 18 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
Aug 28 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
Jun 19 Javascript
Three.js加载外部模型的教程详解
Nov 10 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
Nov 05 #Javascript
node.js域名解析实现方法详解
Nov 05 #Javascript
node.js文件操作系统实例详解
Nov 05 #Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 #Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 #Javascript
js实现随机点名程序
Sep 17 #Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 #Javascript
You might like
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
简单谈谈favicon
2015/06/10 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
详解C++编程中一元运算符的重载
2016/01/19 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python 元类实例解析
2018/04/04 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
Docker下安装Oracle19c
2022/04/13 Servers