Socket.IO 和 HapiJS 之间的连接

     2023-04-18     69

关键词:

【中文标题】Socket.IO 和 HapiJS 之间的连接【英文标题】:Connection between Socket.IO and HapiJS 【发布时间】:2015-12-22 00:24:26 【问题描述】:

我们有一个用 HapiJS 实现的 REST 服务器和一个用 Socket.IO 实现的 Websockets 服务器(它们都在单个服务器上运行,但在不同的端口上)。我想从 HapiJS 服务器通知 Websockets 服务器向特定客户端发送带有一些数据的事件。

套接字服务器在 8081 端口上运行,而 REST 在 8080 上。

这个想法是客户端进行操作(POST 请求),该操作记录在“操作历史记录”表中。该操作涉及其他用户,因此应在发生这种情况时实时通知他们。这就是其他用户监听 websocket 连接的原因。

如何告诉套接字服务器向特定客户端发出事件并且应该从 REST 服务器完成?

我当时想了三个办法:

    使用 RabbitMQ 为套接字和休息和通信分离服务器

    我尝试实现Socket.IO-Emitter,但它需要 Redis 数据库(我仍然不知道为什么)。当我尝试使用发射器从 HapiJS 路由处理程序连接到套接字时,我得到:

      export function* postRefreshEvent(userId) 
        var connection = require('socket.io-emitter')( host: '127.0.0.1', port: 8081 );
        connection.in('UserHistory').emit('refresh', userId); 
        return statusCode: OK
    
              
    
    Error: Ready check failed: Redis connection gone from end event.
    

    在 RedisClient.on_info_cmd

在 Socket 服务器中不执行刷新。我只是没有看到显示的日志。

    创建一个特殊事件并使用普通 socket.io 客户端从 hapijs 连接到 websockets 并在那里发出新事件。

一个样本GIST。

你有想过这样的事情吗?我感谢每一个帮助!

【问题讨论】:

听起来你有点把事情复杂化了。如果这一切都在一台服务器上,为什么不直接调用一个函数或发出一个 EventEmitter 事件呢?在这种情况下不需要引入消息队列之类的东西。 你是对的。很好的解决方案! :) 非常感谢! 嗨@NMP,你最后用的是哪一个?马特方法或使用@hapi/nes 作为西蒙​​的答案? 【参考方案1】:

您可以只使用普通的旧 EventEmitter 在 socket.io 和代码库的 hapi 部分之间进行通信。这是一个有效的示例,并说明了如何执行此操作:

var Hapi = require('hapi');

// Make an event emitter for managing communication
// between hapi and socket.io code

var EventEmitter = require('events');
var notifier = new EventEmitter();

// Setup API + WS server with hapi

var server = new Hapi.Server();
server.register(require('inert'), function () );

server.connection( port: 4000, labels: ['api'] );
server.connection( port: 4001, labels: ['ws'] );

var apiServer = server.select('api');
var wsServer = server.select('ws');

apiServer.route(
    method: 'GET',
    path: '/',
    handler: function (request, reply) 

        reply.file('index.html');
    
);

apiServer.route(
    method: 'GET',
    path: '/action',
    handler: function (request, reply) 

        notifier.emit('action',  time: Date.now() );
        reply('ok');
    
);

// Setup websocket stuff

var io = require('socket.io')(wsServer.listener);

io.on('connection', function (socket) 

    // Subscribe this socket to `action` events

    notifier.on('action', function (action) 
        socket.emit('action', action);
    );
);

server.start(function () 
    console.log('Server started');
);

这是客户端的基本 index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://localhost:4001/socket.io/socket.io.js"></script>
</head>
<body>
    <script>
    var socket = io('http://localhost:4001');
    socket.on('action', function (action) 
        console.log(action);
    );
    </script>
</body>
</html>

如果你运行这个并浏览到http://localhost:4000并打开你的控制台,你就可以用你的浏览器或cURL(curlhttp://localhost:4000/action)向http://localhost:4000/action发出请求,你会看到事件出现在网络上控制台:

【讨论】:

嗨,马特,我可以将 EventEmitter 设为单例,其他模块可能需要它吗?目前,hapi api 的套接字连接和处理程序位于两个不同的模块中,我无法使事件发射器成为两个不同地方所需的单个实例。 我想通了。这是我的错。感谢您的快速回答和帮助! 当然只是从模块中导出它exports.emitter = new EventEmitter(); 没问题。 我们如何从浏览器向服务器发射? @jeff 相同但相反。在客户端调用 socket.emit() 并在服务器上使用 socket.on() 监听。【参考方案2】:

您可以尝试使用https://github.com/hapijs/nes,它通过插件将 websockets 集成到 hapi 中。免责声明我之前没有尝试过或使用过 websockets,但它似乎很好地融入了 hapi .

【讨论】:

很好,我不知道他的。谢谢!

socket io客户端和服务器之间的连接问题

】socketio客户端和服务器之间的连接问题【英文标题】:Connectionproblemsbetweensocketioclientandserver【发布时间】:2021-06-2712:27:14【问题描述】:我正在尝试使用react和express与socket.io设置聊天应用程序,但是在尝试使用socket.io将客户端... 查看详情

无法在 Node.JS 和 React-Native (Socket.IO) 之间建立连接

】无法在Node.JS和React-Native(Socket.IO)之间建立连接【英文标题】:UnabletoestablishconnectionbetweenNode.JSandReact-Native(Socket.IO)【发布时间】:2020-02-1223:40:59【问题描述】:我是React和Node的新手,我正在尝试使用Socket.IO制作一个简单的WebSocke... 查看详情

客户端和服务器端(React/Node.js)之间的 Socket.io 连接失败

】客户端和服务器端(React/Node.js)之间的Socket.io连接失败【英文标题】:Socket.ioconnectionfailsbetweenclientandserverside(Reacr/Node.js)【发布时间】:2020-06-2020:09:21【问题描述】:我正在尝试建立一个基本的套接字连接。服务器如下所示:... 查看详情

CloudFlare 和 socket.io

】CloudFlare和socket.io【英文标题】:CloudFlareandsocket.io【发布时间】:2016-10-2710:37:33【问题描述】:我正在使用CloudFlare来实现RESTAPI。我需要添加一些通过Node.JS上的socket.io实现的通知。当socket.io使用实时连接来保持客户端更新时,... 查看详情

Socket.io 中的连接不稳定

】Socket.io中的连接不稳定【英文标题】:ConnectionisnotstableinSocket.io【发布时间】:2016-02-2104:37:45【问题描述】:我正在使用socket.io构建一个应用程序,以将一些html对象共享给连接到房间的所有用户。但是用户会在一段时间后自动... 查看详情

Socket.io 中的身份验证

】Socket.io中的身份验证【英文标题】:AuthenticationinSocket.io【发布时间】:2015-08-2903:04:51【问题描述】:我将尝试验证socket.io上的连接。目前,用户首先通过RESTAPI进行身份验证,然后,我向用户发送JsonWebToken以及经过身份验证的... 查看详情

来自互联网的本地 Socket.io 连接

】来自互联网的本地Socket.io连接【英文标题】:Socket.ioconnectionlocalfrominternet【发布时间】:2016-07-0613:52:40【问题描述】:我必须使用socket.io创建一个系统,服务器在本地(没有端口转发)(socket.io在端口6255上侦听)和客户端(so... 查看详情

io() 函数前端——socket.io

】io()函数前端——socket.io【英文标题】:Io()functionfrontend-socket.io【发布时间】:2017-04-1612:13:20【问题描述】:我不明白当我将io()函数调用到index.html时,nodejs怎么可能知道必须执行io.on()函数。我知道index.html中的io()函数用于打开... 查看详情

带有 iOS 的 Socket.io 未在移动客户端上连接

】带有iOS的Socket.io未在移动客户端上连接【英文标题】:Socket.iowithiOSnotconnectingonthemobileclient【发布时间】:2019-11-1402:31:45【问题描述】:我正在尝试在服务器和iOS客户端之间创建简单的socket.io通信。我的服务器代码很简单:vario... 查看详情

expressJS 和 socket.io 监听不同的端口和 socket.io 客户端连接

】expressJS和socket.io监听不同的端口和socket.io客户端连接【英文标题】:expressJSandsocket.iolisteningtodifferentportsandsocket.ioclientconnect【发布时间】:2017-06-0321:22:14【问题描述】:所以我有一个使用socket.io和expressjs的nodejs应用程序我将端... 查看详情

react native 和 java 之间的 Socket.io

】reactnative和java之间的Socket.io【英文标题】:Socket.iobetweenreactnativeandjava【发布时间】:2019-03-3104:25:09【问题描述】:我想在我的reactnative应用和java中的服务器之间创建实时数据。我试图用WebSocket做到这一点,但它没有解决它。... 查看详情

socket.io:关于广播和最大连接的查询

】socket.io:关于广播和最大连接的查询【英文标题】:socket.io:Queriesaroundbroadcastingandmaxconnections【发布时间】:2018-02-0908:29:48【问题描述】:我是SocketIO开发的新手。我想知道它周围的以下内容:支持的并发OPEN套接字数量的最大... 查看详情

使用 Socket.Io 聊天应用程序 - 发送和接收消息之间的区别

】使用Socket.Io聊天应用程序-发送和接收消息之间的区别【英文标题】:ChatAppwithSocket.Io-Differencebetweensendingandreceivingamessage【发布时间】:2022-01-1821:42:11【问题描述】:我正在尝试为一个学校项目创建一个小聊天应用程序,但我遇... 查看详情

Socket.IO 和 AngularJS 创建多个连接,如何停止?

】Socket.IO和AngularJS创建多个连接,如何停止?【英文标题】:Socket.IOandAngularJScreatesmultipleconnections,howtostop?【发布时间】:2014-01-0512:45:14【问题描述】:我正在使用AngularJS、Nodejs和Socket.io开发一个实时socket.io应用程序,包括服务... 查看详情

更改请求标头 SOCKET.IO(无需断开连接和重新连接)

】更改请求标头SOCKET.IO(无需断开连接和重新连接)【英文标题】:ChangerequestheadersSOCKET.IO(withoutdisconnectingandreconnecting)【发布时间】:2021-05-0711:46:00【问题描述】:我在建立与我的Socket.IO服务器的连接时设置请求标头,如下所示... 查看详情

与 Socket.io 和 Docker 的连接不能超过 ~980 个

】与Socket.io和Docker的连接不能超过~980个【英文标题】:Cannotgetmorethan~980connectionswithSocket.ioandDocker【发布时间】:2018-03-2212:58:18【问题描述】:我无法使用Docker将我的简单Socket.IO应用扩展到超过980个并发连接。但是,如果我在我... 查看详情

socket.io 广播不适用于 React

】socket.io广播不适用于React【英文标题】:socket.iobroadcastingnotworkingwithReact【发布时间】:2021-12-0717:17:47【问题描述】:我目前正在尝试在后端的Node.js应用程序和前端的React应用程序之间建立连接。从前端到后端的连接似乎没有任... 查看详情

与 nginx、nodejs 和 socket.io 的 WebSocket 连接失败

】与nginx、nodejs和socket.io的WebSocket连接失败【英文标题】:WebSocketconnectionfailedwithnginx,nodejsandsocket.io【发布时间】:2013-12-2110:56:44【问题描述】:我尝试使用nginx设置nodejs。但是当客户端尝试连接时,它会失败...WebSocketconnectionto\'w... 查看详情