首页 > 编程语言 > 【nodejs开发】nodejs实现socket网络通信

【nodejs开发】nodejs实现socket网络通信

时间:2022-10-05 10:07:18浏览次数:66  
标签:网络通信 dgram const socket nodejs server client address

(本节内容如下:)

1、简介

在NodeJS中有三种socket:1. TCP,2. UDP,3. Unix域套接字。

UDP/datagram sockets

Class: dgram.Socket
Event: 'close'
Event: 'connect'
Event: 'error'
Event: 'listening'
Event: 'message'
socket.addMembership(multicastAddress[, multicastInterface])
socket.addSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
socket.address()
socket.bind([port][, address][, callback])
socket.bind(options[, callback])
socket.close([callback])
socket.connect(port[, address][, callback])
socket.disconnect()
socket.dropMembership(multicastAddress[, multicastInterface])
socket.dropSourceSpecificMembership(sourceAddress, groupAddress[, multicastInterface])
socket.getRecvBufferSize()
socket.getSendBufferSize()
socket.ref()
socket.remoteAddress()
socket.send(msg[, offset, length][, port][, address][, callback])
Note about UDP datagram size
socket.setBroadcast(flag)
socket.setMulticastInterface(multicastInterface)
Example: IPv6 outgoing multicast interface
Example: IPv4 outgoing multicast interface
Call results
socket.setMulticastLoopback(flag)
socket.setMulticastTTL(ttl)
socket.setRecvBufferSize(size)
socket.setSendBufferSize(size)
socket.setTTL(ttl)
socket.unref()
dgram module functions
dgram.createSocket(options[, callback])
dgram.createSocket(type[, callback])

2、UDP单播

The dgram module provides an implementation of UDP datagram sockets.

2.1 接收端

  • server.js
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`);
  server.close();
});

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

server.on('listening', () => {
  const address = server.address();
  console.log(`server listening ${address.address}:${address.port}`);
});

server.bind(41234);
// Prints: server listening 0.0.0.0:41234

nodejs接收端的运行截图如下: 在这里插入图片描述

测试c++发送端的运行截图如下: 在这里插入图片描述

2.2 发送端

例子1:

const dgram = require('dgram');

const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.send(message, 41234, 'localhost', (err) => {
  client.close();
});

例子2:

const dgram = require('dgram');
const buf1 = Buffer.from('Some ');
const buf2 = Buffer.from('bytes');
const client = dgram.createSocket('udp4');
client.send([buf1, buf2], 41234, (err) => {
  client.close();
});

例子3:

const dgram = require('dgram');
const message = Buffer.from('Some bytes');
const client = dgram.createSocket('udp4');
client.connect(41234, 'localhost', (err) => {
  client.send(message, (err) => {
    client.close();
  });
});

3、UDP组播

3.1 发送端

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

// const local_ip = "192.168.0.xx";
const multicast_ip = "225.0.0.100"; // 这里必须是一个组播地址(D类IP地址)

server.on('close', () => {
    console.log('close socket');
});

server.on('listening', () => {
    console.log('listening...' );
    server.setBroadcast(true);
    server.setMulticastTTL(128);
    server.addMembership(multicast_ip);

    setInterval(() => {
        send_msg();
    }, 2000);
});

server.on('message', (msg, rinfo) => {
    console.log(`receive client message from ${rinfo.address}: ${rinfo.port}: ${msg}`);
});

server.bind(); // 随机绑定本机一个端口

function send_msg() {
    var date = new Date();
    console.log(date.toLocaleDateString() + " " + date.toLocaleTimeString() + ': send a message.');
    server.send('hi, i am server...', '8062', multicast_ip);
}

在这里插入图片描述

3.2 接收端

const dgram = require('dgram');
var client = dgram.createSocket('udp4');

// const local_ip = '192.168.0.xx';
const multicast_ip = "225.0.0.100"; // 这里必须是一个组播地址(D类IP地址)

client.on('close', () => {
    console.log('client closed');
});

client.on('error', (err) => {
    console.log('client error' + err);
});

client.on('listening', () => {
    console.log('client listening...');
    client.setBroadcast(true);
    client.setMulticastTTL(128);
    client.addMembership(multicast_ip);
});

client.on('message', (msg, rinfo) => {
    console.log(`receive server message from ${rinfo.address}: ${rinfo.port}: ${msg}`);
});
client.bind('8062'); // 监听组播数据的端口

测试接收端1结果如下: 在这里插入图片描述 测试接收端2结果如下: 在这里插入图片描述

标签:网络通信,dgram,const,socket,nodejs,server,client,address
From: https://blog.51cto.com/u_15800063/5732214

相关文章

  • 【总结】1212- 石墨文档是如何通过 WebSocket 实现百万长连接的?
    ​​Web​​​ 服务端推送技术经过了长轮询、短轮询的发展,最终到 ​​HTML5​​​ 标准带来的 ​​WebSocket​​​ 规范逐步成为了目前业内主流技术方案。它使得消息......
  • GO语言开发高性能网络通信服务
     前言轻松的几行代码就可以实现tcp/IP的高性能的网络通信,今天就来介绍一下,使用boot4go-fastnet来实现一个简单的网络通信的例子。昨天的文章,介绍了boot4go-fastnet的实现的......
  • C socket编程遇到的问题
    如何使用WSAGetLastError()printf("%d",WSAGetLastError());返回值:需要的时候再查rval每次都返回-1rval=send(rval,buf,strlen(buf)+1,0);//error10038WSAE......
  • websocket2.0 适用于发送的数据体很大
    当websocket发送的数据体积很大,需要的传输时间很长,并且传输频率较高的情况下使用pom配置<dependency><groupId>org.springframework</groupId......
  • redis远程连接错误SocketTimeoutException: connect timed out
    redis远程连接错误SocketTimeoutException:connecttimedout解决方案:编辑redis.conf文件(建议将其先备份编辑备份文件启动redis服务时直接引入修改好的备份文件)将......
  • 配置nodejs
    --下载左侧ba长期维护版--点击安装--右键管理员打开cmd--输入 node-v--输入npm-v--默认缓存在C盘,修改默认路径--打开安装文件夹--新建node_global 和 ......
  • Nodejs Express Mysql 增删改查
    constmysql=require('mysql2')//注意是mysql2,不是mysql。mysql2支持mysql8.0以上的加密方式constdb=mysql.createPool({host:'127.0.0.1',user:'ro......
  • supervisor /usr/lib64/python2.7/socket.py line: 224
    配置了supervisor之后,写好了配置,最后发现一直报这个错误,supervisorerror:<class‘socket.error’>,[Errno2]Nosuchfileordirectory:file:/usr/lib64/python2.7/......
  • pg_eventserv push pg 变动事件到websocket 服务
    pg_eventserv的实现原理并不难,核心还是利用了pg的特性,只是包装了一个方便的golangserver然后我们可以通过webscoket发送出去参考使用CREATETABLEpeople(......
  • 使用 NodeJS、Typescript 和 tsyringe 实现依赖倒置
    使用NodeJS、Typescript和tsyringe实现依赖倒置依赖倒置是5个SOLID原则之一,在我看来,也是最重要的原则之一,因为它允许通过抽象而不是使用具体实现来解耦模块。记......