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 相关文章推荐
jquery 经典动画菜单效果代码
Jan 26 Javascript
浅析JavaScript中的CSS属性及命名规范
Nov 28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
有关json_decode乱码及NULL的问题
Oct 13 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
Nov 17 Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
Sep 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
mysq GBKl乱码
2006/11/28 PHP
PHP中使用BigMap实例
2015/03/30 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
用Python实现命令行闹钟脚本实例
2016/09/05 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
中学生评语大全
2014/04/18 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
民事二审代理词
2015/05/25 职场文书
赤壁观后感(2)
2015/06/15 职场文书
绿里奇迹观后感
2015/06/15 职场文书
未婚证明格式
2015/06/15 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
辞职信怎么写?
2019/05/21 职场文书
导游词之无锡梅园
2019/11/28 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang