两个项目可以共用redis吗 两个项目之间如何通信_网络

socket 通信流程 

        Socket通信,首先要知道 Socket 是什么,就是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端被称为 socket ,举一个简单的例子就是两个人在线上进行聊天,即线上通信,那么socket通信的流程具体是怎样的?下面通过一张图来了解 socket 的通信流程:

两个项目可以共用redis吗 两个项目之间如何通信_服务器_02

        下面就来实现 socket通信,分两部分,其一是服务端,再者是客户端,那么先来按照图示的流程来完成对服务端(S端)的编写:

[ 小白注解:Node.js中提供了Net核心模块对 socket 的支持,需要引入Net模块,使用 net 提供的createServer() 方法创建基于流的 TCP 或 [IPC][] 服务器,创建一个变量保存客户端对象,使用 .on( 'connection' 监听用户是否接入,使用 .on('data' 对客户端发送消息的监听,同时对这个消息内容进行一个事件的广播,使用 .on('close' 监听数据错误的处理,使用 .on(close 对客户端关闭事件的监听,[可选] 进行一个服务器启动端口的监听使用listen()方法 ]

const net = require('net')

var chatServer = net.createServer(),    // 创建TCP服务器
    clientMap = new Object()            // 存储客户端对象

var i = 0   // 连接名称流水号

chatServer.on('connection', function (client) {
    console.log('客户端用户接入...')
    client.name = ++i
    clientMap[client.name] = client

    // 对客户端发送消息的监听
    client.on('data', function (data) {
        console.log('客户端传来:' + data)
        broadcast(data, client)
    })

    // 数据错误事件处理
    client.on('error',function (err) {
        console.log('Client Error : ' + err )
        client.end()
    })

    // 客户端关闭事件
    client.on('close',function (data) {
        delete clientMap[client.name]
        console.log(client.name + '下线了')
        client.broadcast(client.name + '下线了', client)
    })
})

// 消息广播
function broadcast(message, client){
    for (var key in clientMap) {
        clientMap[key].write(client.name + ':' + message + '\n')
    }
}

// 监听9000端口号
chatServer.listen(9000,() => {
    console.log('Socket Server Running ...')
})

        那么对服务端(S端)已经编写完成,可以自测一下是否启动成功,这里不再演示,待后续客户端一同演示;下面来完成客户端(C端)的编写:

[ 小白注解:引入Net模块,创建一个socket - new net.socket() ,connect()方法连接指定的服务端的端口 (host,port) ,连接到服务器(S端)之后,通过.on('data' 监听服务端传来的数据信息,同时可以向服务器进行数据发送传递,通过Node.js提供的 readline 模块,使用createInterface()方法构造,同时需要 .on('error' 做事件错误处理 和.on('close' 做用户下线反馈 ]

var net = require('net')

var port = 9000
var host = '127.0.0.1'

var client = new net.Socket()
client.setEncoding = 'UTF-8'

// 连接服务器
client.connect(port, host, function () {
    client.write('欢迎!')
})

// 收集
client.on('data',function (data) {
    console.log('服务端传来:' +  data)
    talk()
})

// 错误事件处理
client.on('error',function (err) {
    console.log('Error:' + err)
})

// 关闭连接
client.on('close',function (){ 
    console.log('Connection Closeed')
})

/* https://www.nodeapp.cn/readline.html#readline_readline
   readline - 用于从可读流读取数据 process.stdin-输入 process.stdout-输出  */

const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

function talk() {
    rl.question('请输入:',(inputStr) => {
        if(inputStr != 'bye'){
            client.write(inputStr + '\n')
        }else{
            client.destroy()
        }
    })
}

        以上已经完成S端和C端的代码编写,下面来进行测试运行!

socket 测试效果

· 打开CMD窗口切到编写目录文件进行运行( 运行命令: node + xx.js )

        S端文件 :SocketServer.js         ——  node SocketServer.js

        C端文件 :SocketClient.js          ——  node SocketClient.js


1. 启动服务器 

两个项目可以共用redis吗 两个项目之间如何通信_网络_03

2. 启动客户端 

两个项目可以共用redis吗 两个项目之间如何通信_Node.js_04

        启动客户端之后,此时客户端创建一个socket,连接服务器(127.0.0.1:9000),当客户端与服务器接入成功之后就会使用write()方法写入,此时服务器就会通过 .on('connection' 监听到有用户接入会进行一个打印,以及 .on('data' 监听到客户端传递的数据,调用 broadcast() 方法进行广播

3. 回看服务器

两个项目可以共用redis吗 两个项目之间如何通信_Node.js_05

4. 在客户端中输入数据

两个项目可以共用redis吗 两个项目之间如何通信_两个项目可以共用redis吗_06

         输入之后,会进行调用 talk()方法,进行一个写入,此时服务器监听到客户端的数据会对数据进行一个广播,此时被客户端监听到服务器广播的数据进行一个打印 .on('data',function(){ console.log('服务器传来'....) }) ,所以会返回服务端传...这段;可以看一下服务端是不是收到客户端传过去的这个 “在吗?” ,如下图:

两个项目可以共用redis吗 两个项目之间如何通信_网络_07

 5. 再启动一个客户端

两个项目可以共用redis吗 两个项目之间如何通信_网络_08

         启动第二个客户端之后,可以会看服务端,是否会有客户端接入的提示:如下

两个项目可以共用redis吗 两个项目之间如何通信_Socket通信_09

        那么第二个客户端的接入传到服务端会被服务端进行一个广播,此时在第一个客户端中是会监听来自服务端的一个广播并打印处理,如下:

两个项目可以共用redis吗 两个项目之间如何通信_服务器_10

6.在第二个客户端输入消息

· 第二个客户端

两个项目可以共用redis吗 两个项目之间如何通信_服务器_11

· 第一个客户端

两个项目可以共用redis吗 两个项目之间如何通信_服务器_12

两个项目可以共用redis吗 两个项目之间如何通信_两个项目可以共用redis吗_13

· 第二个客户端

两个项目可以共用redis吗 两个项目之间如何通信_服务器_14

        收到来自第一个客户端的广播信息 !

7. 下线

两个项目可以共用redis吗 两个项目之间如何通信_两个项目可以共用redis吗_15

        以上就是使用Node中的Net模块对socket通信的一个实现,那么在之后回来将另外一个 WebSocket 实现通信,那么本篇内容就到此结束,感谢大家的支持!!!

两个项目可以共用redis吗 两个项目之间如何通信_网络_16