我在Angular应用程序中使用SignalR.当我在Angular中销毁组件时,我也想停止与集线器的连接.我使用命令:
this.hubConnection.stop();
Run Code Online (Sandbox Code Playgroud)
但是我在Chrome控制台中收到错误: Websocket已关闭状态代码:1006
在Edge中:错误错误:未捕获(在承诺中):错误:由于连接被关闭而取消了调用.错误:由于连接已关闭而取消了调用.
它实际上工作,连接已经停止,但我想知道为什么我得到错误.
这就是我启动集线器的方式:
this.hubConnection = new HubConnectionBuilder()
.withUrl("/matchHub")
.build();
this.hubConnection.on("MatchUpdate", (match: Match) => {
// some magic
})
this.hubConnection
.start()
.then(() => {
this.hubConnection.invoke("SendUpdates");
});
Run Code Online (Sandbox Code Playgroud)
编辑
我终于找到了这个问题.它是由Mongo改变流引起的.如果我从SendUpdates()方法中删除代码,则会触发OnDisconnected.
public class MatchHub : Hub
{
private readonly IMatchManager matchManager;
public MatchHub(IMatchManager matchManager)
{
this.matchManager = matchManager;
}
public async Task SendUpdates() {
using (var changeStream = matchManager.GetChangeStream()) {
while (changeStream.MoveNext()) {
var changeStreamDocument = changeStream.Current.FullDocument;
if (changeStreamDocument == null) {
changeStreamDocument = BsonSerializer.Deserialize<Match>(changeStream.Current.DocumentKey);
}
await Clients.Caller.SendAsync("MatchUpdate", changeStreamDocument); …Run Code Online (Sandbox Code Playgroud) 现在,我在My iPhone Application上创建了一个HTTP Server,并在那里托管了HTML.然后在浏览器中访问位于iPhone同一网络中的系统.我可以在浏览器上看到文件.
现在使用WebSockets我试图将文件从浏览器发送到应用程序,但它不起作用.文本消息没问题,但数据没有.作为一种解决方法,我通过Base64 String尝试了它,但在这种情况下也是套接字Get Closed.
为了使用JAVAScript上传,我编写了这段代码,在这里我尝试通过发送大小为200个字符的片段的Base64字符串.
function sendFile() {
var preview = document.querySelector('img');
var file = document.querySelector('input[type=file]').files[0];
var reader = new FileReader();
var rawData = new ArrayBuffer();
reader.onloadend = function () {
var stringContent = reader.result;
preview.src = stringContent;
var array = stringContent.match(/.{1,200}/g);
for (var i = 0; i < array.length; i++) {
ws.send(array[i]);
};
}
if (file) {
reader.readAsDataURL(file);
}else {
preview.src = "";
}
}
Run Code Online (Sandbox Code Playgroud)
在iPhone方面,我使用了Libary CocoaHTTPServer的WebSocket类
插座在此处关闭.

编辑
经过大量的试验和错误后,我才知道发生这种情况如果我在Mac浏览器中打开这个,不是在任何其他设备的浏览器如iPad,iPhone.这是非常奇怪的用例,但它是真的.
编辑二
经过大量的疑惑,我发现了一个线索,这对iPhone,iPad,iPod和Opera浏览器很有效,因为它们有旧的websocket支持,我从 …
我正在我的网页游戏中记录断开连接。似乎 75% 的会话因代码 1001(正常)而断开连接,25% 的会话因代码 1006(错误)而断开连接。https://www.rfc-editor.org/rfc/rfc6455
有时,关于错误原因,我会看到以下文字:
CloudFlare WebSocket 代理重新启动
但 1006 次断开连接中的大多数根本没有给出任何原因。玩家们毫无理由地断开连接。这通常发生在玩家正在积极玩游戏的 5-30 分钟内。
我的设置有这些:
我的问题是:
在客户端到服务器之间建立 Web 套接字连接时,连接可能会由于多种原因意外关闭:
我正在寻找处理此类情况的方法,或者至少知道它们发生了。
在阅读有关 WebSocket close 的文章时,我了解到 WebSocket 协议支持服务器发起的乒乓操作 ,可用于服务器了解客户端是否崩溃。(不支持客户端发起的乒乓)。- 这是处理客户端崩溃的最佳方法吗?
另外,我在规范中看到,在客户端我们可以监听 onClose 事件,并且有几个代码可以理解为什么连接已关闭 - 当服务器崩溃时是否总是调用 onClose 事件?
websocket ×3
cloudflare ×1
ios ×1
iphone ×1
javascript ×1
mongodb ×1
nginx ×1
node.js ×1
signalr ×1
sockets ×1