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 相关文章推荐
js 加载时自动调整图片大小
May 28 Javascript
javascript function调用时的参数检测常用办法
Feb 26 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
javascript语言结构小记(一)
Sep 10 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
JS网页播放声音实现代码兼容各种浏览器
Sep 22 Javascript
基于JQuery实现的Select级联
Jan 27 Javascript
JavaScript Array对象扩展indexOf()方法
May 09 Javascript
jQuery中prependTo()方法用法实例
Jan 08 Javascript
js进行表单验证实例分析
Feb 10 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
详解javascript传统方法实现异步校验
Jan 22 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的一个登录的类 [推荐]
2007/03/16 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
python3 shelve模块的详解
2017/07/08 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python使用wxPython实现计算器
2018/01/30 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
单身旅行者的单身假期:Just You
2018/04/08 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
大学老师推荐信
2014/02/25 职场文书
2014年人事部工作总结
2014/12/03 职场文书
初婚未育证明样本
2015/06/18 职场文书
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript