WebSocketSubject 不工作

Posted

技术标签:

【中文标题】WebSocketSubject 不工作【英文标题】:WebSocketSubject not working 【发布时间】:2018-07-16 14:50:42 【问题描述】:

我正在尝试使用angular 客户端通过websocket 连接php 后端。 我正在尝试使用来自rxjsWebSocketSubject,但不知何故我无法建立连接。

此代码无效

this.socket$ = WebSocketSubject.create('ws://localhost:12345/websockets.php');

this.socket$
   .subscribe(
       (message) =>  
             console.log(message);
        ,
       (err) => console.error(err)
);

我在控制台上也没有收到任何错误。

我已经用 ES6 WebSocket 进行了测试,效果很好。所以服务器没有问题。反应很好。

此代码有效:

var host = 'ws://localhost:12345/websockets.php';
var socket = new WebSocket(host);
socket.onmessage = function(e) 
    console.log(e.data)
;

有人可以指出我,我在这里缺少什么吗?

【问题讨论】:

不工作是什么意思?它会给出您在开发工具中看到的错误吗? 完全没有错误。这至少对我有帮助。 你看到正在创建的 websocket 了吗? @Jacopofar 不,它没有建立任何连接。我尝试登录服务器代码。 【参考方案1】:

rxjs 界面略有变化。在哪里实例化 WebSocketSubject 更改:

this.webSocketSubject = WebSocketSubject.create(...);

到:

this.webSocketSubject = new WebSocketSubject(...);

以及您向服务器发送消息的位置发生变化:

this.webSocketSubject.next(JSON.stringify(request));

到:

this.webSocketSubject.next(request);

【讨论】:

感谢您的回复。我想它在解析方面还有一些问题。因为我从服务器获得的响应总是调用subscribeerror 块。我得到Unexpected token N in JSON at position 0。发生了一些内部解析,不确定是什么。 @AmitChigadani 您是否删除了客户端的JSON.stringify 我没有从客户端发送任何消息。我只从服务器接收它。 @AmitChigadani 检查来自服务器端的消息内容(在开发者工具/网络/本地主机中),以查看您来自服务器的消息是有效的 JSON,例如,clientId: 209, messageType: "LoginResp", requestId: 6。跨度> 我实际上是在发送一个字符串缓冲区而不是 JSON 对象。我的服务器代码在 php.ini 中。我正在使用 socket_write php.net/manual/en/function.socket-write.php【参考方案2】:

您应该使用方法创建一个可观察对象:fromEvent,这可以从 rxjs 导入。

1.创建 websocket

创建一个新的 WebSocket('withyoururl'):

const websocket = new WebSocket('ws://localhost:12345/websockets.php');

Websocket documentation

2。设置你的事件监听器

例如,在 onopen 时发送您的身份验证。

websocket.onopen = (event) => websocket.send(JSON.stringify('jwt': 'blaat'))

Listeners

3.从事件创建可观察对象

您可以从事件中创建可观察对象,一旦您订阅它就会收到此事件。

import  fromEvent  from 'rxjs';

const observable$ = fromEvent(websocket, 'message'); // Receives message events once you subscribe to this observable.

Creation of observable from an event

【讨论】:

我知道我在问题中也提到过这种方法。但是知道为什么它不能与WebSocketSubject 一起使用吗?【参考方案3】:

要创建基于 websockets 的流,您可以使用 websocket 函数(!):

import  webSocket  from 'rxjs/webSocket';     

this.socket$ = websocket('ws://localhost:12345/websockets.php');

this.socket$
  .subscribe(
     (message) =>  
           console.log(message);
      ,
     (err) => console.error(err)
);

【讨论】:

谢谢,我会试试这个,让你知道。我猜这种方法应该可行。但仍然不确定webSocketSubject 有什么问题。 看起来,它现在正在建立连接,但没有从服务器获取数据,而是执行了错误回调。它打印Event isTrusted: true isTrusted: true __proto__: Event

以上是关于WebSocketSubject 不工作的主要内容,如果未能解决你的问题,请参考以下文章

WebSocketSubject - 优势?

从 WebSocketSubject 反序列化 Blob 对象

Angular2 - 如何关闭 WebSocketSubject 底层套接字

使用 RxJs WebSocketSubject 和 Angular Universal 时出现“ReferenceError: WebSocket is not defined”

从组件到服务的角度9传递方法

Websocket 在 localhost 但不是 Heroku