无法从 websocket rxjs 节点 Angular 获得响应

Posted

技术标签:

【中文标题】无法从 websocket rxjs 节点 Angular 获得响应【英文标题】:can't get response from websocket rxjs node Angular 【发布时间】:2018-07-31 17:11:11 【问题描述】:

尝试使用 rxjs webSocket 让 WebSocket 工作

我设置了一个节点服务器,目前没有抛出任何错误,但它不会向服务器或连接的用户发送消息

当我使用'ws://echo.websocket.org/'时,它似乎工作得更好,我看到消息回显给我,但是,我没有看到发送的消息,在其他打开的浏览器中,基本上没有通信用户之间,应该订阅 websocket

我想要的只是一种在用户之间传递简单信息的简单方法

index.js

var express = require('express');


var WebSocketServer = require('websocket').server;

var app2 = express()//There is already another app var for main app server
var server2 = http.createServer(app2);
var server2 = app2.listen(8081, function () 
  console.log((new Date()) + ' Server is listening on port 8081');
)


  wsServer = new WebSocketServer(
  httpServer: server2,
  autoAcceptConnections: false
);

function originIsAllowed(origin) 

  if (origin === 'http://localhost:1234')
    return true;

  
// put logic here to detect whether the specified origin is allowed.



wsServer.on('request', function(request) 

  if (!originIsAllowed(request.origin)) 
    // Make sure we only accept requests from an allowed origin
    request.reject();
    console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
    return;
  

  var connection = request.accept(null, request.origin);
  console.log((new Date()) + ' Connection accepted.');
  connection.on('message', function(message) 
    // console.log(message)
      if (message.type === 'utf8') 
          console.log('Received Message from: ' + connection.remoteAddress);
          connection.sendUTF(message.utf8Data);
      
      else if (message.type === 'binary') 
          console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
          connection.sendBytes(message.binaryData);
      
  );
  connection.on('close', function(reasonCode, description) 
      console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
  );
);

在我的客户端套接字服务中:

import  Injectable  from '@angular/core';
import  Observable  from '../../../node_modules/rxjs';

@Injectable()
export class SocketService 
  socket$ = Observable.webSocket( 'ws://localhost:8081');
  // 'ws://echo.websocket.org/'
  constructor() 
      this.connectToSocket()
   

  connectToSocket()
    this.socket$.subscribe(
      (message) => console.log('message received: ' + message),
      (err) => console.log(err),
      () => console.log('complete')
    );
  



为了从另一个组件发送消息,我使用:

this.socketService.socket$.next(JSON.stringify('test'))

【问题讨论】:

【参考方案1】:

根据WebSocket-Node (https://github.com/theturtle32/WebSocket-Node/blob/master/docs/WebSocketServer.md) 的文档,您必须在继续握手之前以编程方式接受每个连接。

您可以改为将服务器配置的autoAcceptConnections 选项设置为true,如下所示:

const wss = new WebSocketServer( httpServer: server2, autoAcceptConnections: true );

如果您确实有自定义请求检查要求,您可以在 request 处理程序中使用 acceptreject,如下所示:

request.accept('chosen-protocol', 'accepted-origin') 

request.reject()

【讨论】:

非常感谢,使用您提供的文档我得到了它的工作并更新了我的问题,我现在唯一的问题是如果我打开 2 个浏览器,消息不会在它们之间进行广播,如何使用多个窗口进行测试? 每个浏览器都有自己的连接,因此您必须跟踪它们,例如通过将每个连接放在连接上的数组中。然后,如果有人发送消息,则遍历数组中的每个连接并将消息发回。 WebSocket 没有开箱即用的广播。 我明白了,再次感谢,你让事情变得更清晰了

以上是关于无法从 websocket rxjs 节点 Angular 获得响应的主要内容,如果未能解决你的问题,请参考以下文章

无法解析 JSON 数据以与 rxjs 交互

rxjs websocket:心跳和重新连接

Angular4 Websocket rxjs重新连接和onError

角度 4 上的 rxjs-websockets,处理重新连接

无法从android okhttp3连接到节点websocket

rxjs/webSocket - 到“ws://localhost:3000/”的 WebSocket 连接失败:连接在收到握手响应之前关闭