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下给元素添加事件的方法与代码
Aug 13 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
input标签内容改变的触发事件介绍
Jun 18 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
jQuery删除当前节点元素
Dec 07 Javascript
BootStrap3使用错误记录及解决办法
Dec 22 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
Feb 17 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 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 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python reduce 函数使用详解
2017/12/05 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
利用python实现AR教程
2019/11/20 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
安全教育心得体会
2013/12/29 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
合作投资意向书
2014/04/01 职场文书
个人租房协议书范本
2014/09/30 职场文书
机关作风建设整改方案
2014/10/27 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
MySQL索引失效场景及解决方案
2022/07/23 MySQL