热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:node.js中net网络模块TCP服务端与客户端的使用

篇首语:本文由编程笔记#小编为大家整理,主要介绍了node.js中net网络模块TCP服务端与客户端的使用相关的知识,希望对你有一定的参考价值。node.js中net模块

篇首语:本文由编程笔记#小编为大家整理,主要介绍了node.js中net网络模块TCP服务端与客户端的使用相关的知识,希望对你有一定的参考价值。


node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口。

 

一、创建服务器并监听端口


const net = require(‘net‘);
//创建一个tcp服务
//参数一表示创建服务的一些配置
//参数二表示 事件 ‘connection‘ 监听回调函数
let server = net.createServer({
//表示是否允许一个半开的TCP连接,默认为false
allowHalfOpen: false,
//一旦来了连接,是否暂停套接字,默认为false
pauseOnConnect: false
});
server.listen(6666);
//一个新的连接建立时触发 ‘connection‘ 事件
server.on(‘connection‘, function (socket) {
//注意这里的socket是一个流,既可以读,也可以写
//当我们监听 ‘data‘ 事件后,系统就会不断的从流中读取数据
socket.on(‘data‘, function (data) {
console.log(‘服务器接收到 : ‘, data.toString());
});
});
//服务调用 server.listen() 监听后就会触发该事件
server.on(‘listening‘, function () {
// address() 方法返回服务器地址信息对象
let addr = server.address();
console.log(`服务器监听 : ${addr.port} 端口`);
});
//服务关闭时触发,如果还有连接存在,则直到所有连接结束才会触发该事件
server.on(‘close‘, function () {
console.log(‘服务关闭‘);
});
//出现错误时触发
server.on(‘error‘, function (err) {
console.log(err);
});

windows下可以通过telnet 或 xshell,putty等工具连接上该服务,进行交互。

我们可以通过 getConnections() 实时获取当前服务器的连接数。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
//一个新的连接建立时触发 ‘connection‘ 事件
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
socket.on(‘data‘, function (data) {
console.log(‘服务器接收到 : ‘, data.toString());
});
});

我们可以手动的设置服务器的最大连接数,如果超过该连接数,则会拒绝连接。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
//设置最大连接数为3,当有第4个连接请求时,连接会拒绝。
server.maxCOnnections= 3;
});
//一个新的连接建立时触发 ‘connection‘ 事件
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
socket.on(‘data‘, function (data) {
console.log(‘服务器接收到 : ‘, data.toString());
});
});

我们也可以使用 close() 手动的拒绝所有连接请求,当已连接的客户端都关闭后,则服务器会自动关闭,并触发 ‘close‘ 事件。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
//一个新的连接建立时触发 ‘connection‘ 事件
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
socket.on(‘data‘, function (data) {
console.log(‘服务器接收到 : ‘, data.toString());
});
});
server.on(‘close‘, function () {
console.log(‘服务器被关闭‘);
});
//5秒后手动关闭服务器,拒绝所有连接请求,已有连接全部关闭后,触发 ‘close‘ 事件
setTimeout(function () {
server.close();
}, 5000);

调用 unref() 后,则当所有客户端连接关闭后,将关闭服务器。ref() 功能与 unref() 相反。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
//一个新的连接建立时触发 ‘connection‘ 事件
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
socket.on(‘data‘, function (data) {
console.log(‘服务器接收到 : ‘, data.toString());
});
socket.on(‘close‘, function () {
console.log(‘客户端关闭‘);
//调用unref()后,当所有客户端连接都关闭后,将关闭服务器
server.unref();
});
});
server.on(‘close‘, function () {
console.log(‘服务器关闭‘);
});

  

二、net.Socket是一个socket端口对象,是一个全双工的可读可写流


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
console.log(‘客户端信息 : ‘, socket.address());
//接收到数据时触发
socket.on(‘data‘, function (data) {
//我们可以从流中读取数据
console.log(‘服务器接收到 : ‘, data.toString());
console.log(‘累计接收的数据大小 : ‘, socket.bytesRead);
console.log(‘累计发送的数据大小 : ‘, socket.bytesWritten);
//也可以向流中写入数据
let flag = socket.write(`服务器向你发送 : ${data.toString()}
`);
console.log(‘flag : ‘, flag);
console.log(‘当前已缓冲并等待写入流中的字节数 : ‘, socket.bufferSize);
});
//连接关闭时触发
socket.on(‘end‘, function () {
console.log(‘客户端关闭‘);
});
//连接完全关闭时触发
socket.on(‘close‘, function () {
console.log(‘客户端完全关闭‘);
});
//发生错误时触发
socket.on(‘error‘, function (err) {
console.log(err);
});
});

我们可以通过 puase() 和 resume() 方法暂停读写数据。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
//接收到数据时触发
socket.on(‘data‘, function (data) {
console.log(‘接收到的数据 : ‘, data.toString());
setTimeout(function () {
//3秒后暂停读取数据
socket.pause();
}, 3000);
setTimeout(function () {
//6秒后恢复读取数据
socket.resume();
}, 6000);
});
});

net.Socket对象是一个流,既然是流,那么我们可以通过 pipe() 方法建一个到文件的可写流,把从客户端接收的数据写入到一个文件中。


const net = require(‘net‘);
const fs = require(‘fs‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
let ws = fs.createWriteStream(‘./1.txt‘);
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
//接收到数据时触发
socket.on(‘data‘, function (data) {
console.log(‘接收到的数据 : ‘, data.toString());
});
//注意这里的第二个参数,设为 false。
//每当有一个新的连接时,就会创建一个新的 socket 对象。
//不然当第一个socket对象结束操作或关闭时,会自动关闭 ws 可写流。
//后续的socket对象将无法往 ws 里写入数据。
socket.pipe(ws, {end: false});
socket.on(‘end‘, function () {
console.log(‘客户端关闭‘);
socket.unpipe(ws);
});
});

通过 setTimeout() 我们可以设置一个连接活动的超时时间,当一个连接超时时,将触发 ‘timeout‘ 事件。


const net = require(‘net‘);
let server = net.createServer();
server.listen(6666, ‘0.0.0.0‘, function () {
console.log(‘服务器监听开始‘);
});
server.on(‘connection‘, function (socket) {
//获取当前服务器的连接数
server.getConnections(function (error, count) {
console.log(‘当前服务器的连接数 : ‘, count);
});
//接收到数据时触发
socket.on(‘data‘, function (data) {
console.log(‘接收到的数据 : ‘, data.toString());
});
socket.setTimeout(3 * 1000);
//连接超时后,并不会断开,需手动调用 end() 或 destroy() 来断开连接
socket.on(‘timeout‘, function () {
console.log(‘当前连接已超时‘);
});
});

  

三、创建一个tcp客户端


const net = require(‘net‘);
//创建一个tcp客户端
let client = new net.Socket();
client.connect({
host: ‘127.0.0.1‘,
port: 6666
});
//客户端与服务器建立连接触发
client.on(‘connect‘, function () {
client.write(‘你好服务器‘);
});
//客户端接收数据触发
client.on(‘data‘, function (data) {
console.log(‘服务器发送的数据 : ‘, data.toString());
});

客户端可以通过调用 end() 方法来主动关闭与服务端的连接。


const net = require(‘net‘);
//创建一个tcp客户端
let client = new net.Socket();
client.connect({
host: ‘127.0.0.1‘,
port: 6666
});
//客户端与服务器建立连接时触发
client.on(‘connect‘, function () {
//往服务端写入数据
client.write(‘你好服务器‘);
});
//客户端接收数据时触发
client.on(‘data‘, function (data) {
console.log(‘服务器发送的数据 : ‘, data.toString());
});
setTimeout(function () {
client.end();
}, 3000);

通过 setKeepAlive() 方法来禁用或启用长连接功能,防止时间过短而断开连接。setKeepAlive() 会发送一个空包,来保持通信。


const net = require(‘net‘);
//创建一个tcp客户端
let client = new net.Socket();
client.connect({
host: ‘127.0.0.1‘,
port: 6666
});
//设置连接保持
client.setKeepAlive(true, 3000);
//客户端与服务器建立连接触发
client.on(‘connect‘, function () {
client.write(‘你好服务器‘);
});
//客户端接收数据触发
client.on(‘data‘, function (data) {
console.log(‘服务器发送的数据 : ‘, data.toString());
});
setTimeout(function () {
client.end();
}, 3000);

  

 


推荐阅读
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 在PHP中,为了更高效地打开和读取目录并列出其中的文件,可以使用一个自定义函数来返回查询目录下的文件和文件夹列表。该函数会将结果以数组形式返回,并明确区分每个条目是文件还是目录,从而提供更友好和实用的输出。此外,该函数还可以进一步扩展,支持递归查询子目录,以便更全面地获取目录结构信息。 ... [详细]
  • 本地存储组件实现对IE低版本浏览器的兼容性支持 ... [详细]
  • 利用 JavaScript 和 Node.js 验证时间的有效性
    本文探讨了如何使用 JavaScript 和 Node.js 验证时间的有效性。通过编写一个 `isTime` 函数,我们可以确保输入的时间格式正确且有效。该函数利用正则表达式匹配时间字符串,检查其是否符合常见的日期时间格式,如 `YYYY-MM-DD` 或 `HH:MM:SS`。此外,我们还介绍了如何处理不同时间格式的转换和验证,以提高代码的健壮性和可靠性。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 近期,针对Axis2默认凭据漏洞的攻击案例在安全社区引起了广泛关注。这些攻击通常利用Axis2的默认用户名和密码进行渗透测试,技术手段相对固定。本文在综合分析多个案例的基础上,详细探讨了该漏洞的安全风险,并提出了有效的防范措施,以帮助企业和开发者加强Web服务的安全防护。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
author-avatar
詹慧君874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有