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 相关文章推荐
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
JQuery的ready函数与JS的onload的区别详解
Nov 21 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 Javascript
js实现图片点击左右轮播
Jul 08 Javascript
JS控制表单提交的方法
Jul 09 Javascript
跟我学习javascript的作用域与作用域链
Nov 19 Javascript
微信小程序实现的绘制table表格功能示例
Apr 26 Javascript
基于vue写一个全局Message组件的实现
Aug 15 Javascript
JS原形与原型链深入详解
May 09 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
package.json文件配置详解
2017/06/15 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python模拟登录12306的方法
2014/12/30 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python新手学习标准库模块命名
2020/05/29 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
大型会议接待方案
2014/03/01 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
新郎新娘答谢词
2015/01/04 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js