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()} \r\n`);
        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);

  

原文地址:https://www.cnblogs.com/jkko123/p/10247593.html

时间: 2024-10-06 00:07:02

node.js中net网络模块TCP服务端与客户端的使用的相关文章

node.js模拟抄表 tcp服务端和客户端

2015-11-18 09:38:01 服务端 var net = require('net'); var server = net.createServer(function (socket) { socket.on('data', function (data) { console.log(data); // data = JSON.parse(data); console.log('此次需要的类型是:' + data.transType); if (data.order == 'order

node.js中使用net模块创建服务器和客户端

1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require("net"); // 创建一个net.Server用来监听,当连接进来的时候,就会调用我们的函数 // client_sock,就是我们的与客户端通讯建立连接配对的socket // client_sock 就是与客户端通讯的net.Socket var server = net.createServer(function(client_soc

JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言

作者:李宁老师 东北大学计算机专业硕士.曾任沈阳东软股份项目经理.51CTO学院签约讲师.从事软件研究和开发超过20年.长久以来一直从事Java.Android.iOS.C++.Swift.Objective-C以及跨平台游戏引擎(Cocos2d-x.Unity3D等)的开发和技术指导工作.对国内外相关领域的技术.理论和实践有很深的理解和研究. 主要著作包括<Cocos2d-x实战游戏开发指南>(即将出版).<Swift权威指南>.<Android深度探索 卷1和卷2>

编写一个简单的TCP服务端和客户端

下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现的功能很简单,但是对于初来乍到的我费了不少劲,因此在此总结一下,如有错点请各位大神指点指点 什么是SOCKET(套接字): 百度的解释是:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 将计算机比作酒店,那么通过IP寻找主机,就好比通过地址寻址酒店.通过端

php编写TCP服务端和客户端程序

From: http://blog.csdn.net/anda0109/article/details/46655301 1.修改php.ini,打开extension=php_sockets.dll 2.服务端程序SocketServer.php [php] view plaincopyprint? <?php //确保在连接客户端时不会超时 set_time_limit(0); //设置IP和端口号 $address = "127.0.0.1"; $port = 3046;

Tcp服务端判断客户端是否断开连接

今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接. 然后就开始找各种方法.其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因............ 参考的方法: 下面来罗列一下判断远端已经断开的方法: 法一: 当recv()返回值小于等于0时,socket连接断开

tcp 服务端和客户端程序设计

一.实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/article/details/7055985 二.实验平台 linux操作系统 三.实验内容 编写Linux下TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并向客户端发送字符串. 四.实验原理 使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通

手写一个模块化的 TCP 服务端客户端

前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识. 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”. 对于 Socket 编程这类所需知识偏底层的情况(OS 协议栈的运作机制,TCP 协议的理解,多线程的理解,BIO/NIO 的理解,阻塞函数的运作原理甚至是更底层处理器的中断.网卡等外设与内核的交互.核心态与内核态的切

Node.js中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Node.js调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构建一个