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 相关文章推荐
JavaScript 组件之旅(二)编码实现和算法
Oct 28 Javascript
基于jQuery的左右滚动实现代码
Dec 03 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
js对象继承之原型链继承实例
Jan 10 Javascript
JavaScript事件类型中UI事件详解
Jan 14 Javascript
javascript原型继承工作原理和实例详解
Apr 07 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
Oct 09 jQuery
vue以组件或者插件的形式实现throttle或者debounce
May 22 Javascript
基于openlayers实现角度测量功能
Sep 28 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
Zerg建筑一览
2020/03/14 星际争霸
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python进行两个表格对比的方法
2018/06/27 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
基于opencv实现简单画板功能
2020/08/02 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
运动会入场式解说词
2014/02/18 职场文书
学风建设演讲稿
2014/09/12 职场文书
销售人员管理制度
2015/08/06 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
python获取带有返回值的多线程
2022/05/02 Python
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers