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 相关文章推荐
JObj预览一个JS的框架
Mar 13 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
Sep 04 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
vue全局组件与局部组件使用方法详解
Mar 29 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
vue实现通讯录功能
Jul 14 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 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
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
python爬虫使用cookie登录详解
2017/12/27 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
简历中个人自我评价分享
2014/03/15 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
毕业欢送会致辞
2015/07/29 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS