WebSocketSubject 不工作
Posted
技术标签:
【中文标题】WebSocketSubject 不工作【英文标题】:WebSocketSubject not working 【发布时间】:2018-07-16 14:50:42 【问题描述】:我正在尝试使用angular
客户端通过websocket
连接php
后端。
我正在尝试使用来自rxjs
的WebSocketSubject
,但不知何故我无法建立连接。
此代码无效
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);
【讨论】:
感谢您的回复。我想它在解析方面还有一些问题。因为我从服务器获得的响应总是调用subscribe
的error
块。我得到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 反序列化 Blob 对象
Angular2 - 如何关闭 WebSocketSubject 底层套接字
使用 RxJs WebSocketSubject 和 Angular Universal 时出现“ReferenceError: WebSocket is not defined”