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 图片截取工具jquery.imagecropper.js
Apr 09 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
JavaScript实现url参数转成json形式
Sep 25 Javascript
vue多级多选菜单组件开发
Sep 08 Javascript
微信小程序上传图片到服务器实例代码
Nov 07 Javascript
js最简单的双向绑定实例讲解
Jan 02 Javascript
element-ui 表格实现单元格可编辑的示例
Feb 26 Javascript
react build 后打包发布总结
Aug 24 Javascript
vue-router权限控制(简单方式)
Oct 29 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 获得汉字拼音首字母的函数
2009/08/01 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
javascript一些不错的函数脚本代码
2008/09/10 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
详解flask入门模板引擎
2018/07/18 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python实现的发邮件功能示例
2019/09/11 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
html5 div布局与table布局详解
2016/11/16 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
2014三八妇女节活动总结
2014/03/01 职场文书
公司应聘自荐书
2014/06/14 职场文书
九寨沟导游词
2015/02/02 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
源码安装apache脚本部署过程详解
2022/09/23 Servers