javascript - Websocket 无法在 Chrome/Firefox 上发送/接收消息,在 Microsoft Edge 上工作正常

标签 javascript c# google-chrome websocket webkit

我正在为 Unity(C#) 制作一个远程调试工具,并且我在游戏中设置了一个 C# WebSocket 服务器来发出日志消息。

远程调试客户端使用 JavaScript,位于由游戏创建的 http 服务器提供的页面上。

我似乎在某些浏览器上发送消息时遇到了问题,我不确定为什么。我在本地主机上运行 websocket 服务器并在本地运行客户端,我知道 chrome/firefox 并不真正喜欢这种东西。但奇怪的是我没有收到任何硬错误或异常。失败似乎是默默地失败。

我非常确定这个问题与 JS/浏览器有关,因为 C# websocket 服务器在所有情况下都可以正常工作并接收连接。

无论如何,这是 JS 代码的套接字部分:

var socket = null;
var host = "ws://"+window.location.hostname;
var port = 55000;
var url = host+":"+port+"/msg";

function CheckSocketStatus()
{
    if(socket!=null){
        console.log(socket.readyState);
    }
}

function CreateSocket()
{
    socket = new WebSocket(url);

    socket.onopen = function()
    {
        // // Web Socket is connected, send data using send()
        console.log("Socket Open!");
        socket.send("Here's a client message for ya!");
    };

    socket.onmessage = function (evt) 
    { 
        var message = evt.data;
        console.log("MSG: " + message);
        var obj = JSON.parse(message);
        console.log(obj)
        console.log(obj.type)
        if(obj.type == "log"){
            console.log("Recieved Log");
            handleLogMessage(obj);
        }
    };

    socket.onerror = function()
    {
        console.log("Error!");
    }

    socket.onclose = function(event)
    { 
        // websocket is closed.
        console.log(event.code);

        console.log("Connection is closed...");
        socket = null;
    };
}

在所有情况下,当我调用 CreateSocket() 时,都会创建套接字并成功连接到服务器。我还有 CheckSocketStatus() 函数,它在套接字打开后返回“1”(这应该意味着打开/准备好发送/接收)。之后,结果如下:

Chrome:

Immediately Closes after sending a message.

Chrome 会在连接后立即关闭。我在 onopen() 函数中做的唯一事情是 console.log() 和 send()。如果我删除 send() 那么套接字将保持打开状态。我没有收到来自服务器的任何消息。

火狐: 即使我在 onopen() 中调用 send() 函数,Firefox 也会无限期地保持套接字打开。但是,服务器不会收到来自客户端的任何消息,反之亦然。我觉得我设法让它更早地发送了客户端->服务器,但是在测试这个问题时我无法重现它。

微软边缘: 奇怪的是,Edge 工作正常。我可以接收和发送消息。完全按预期工作。

节点 Webkit (nw.js): 我也在尝试将其编写为 nw.js 应用程序。可以预见的是,由于它在 chromium(或 googly 的东西)上运行,它会产生与 Chrome 相同的结果。


所以我不太确定发生了什么。我不是真正的网络程序员,所以复杂的 http 东西不是我的强项。我真的希望这只是 chrome/firefox 的本地文件问题,如果我连接到外部主机,它会在这些平台上正常工作。明天我将尝试使用一些非本地主机服务器对此进行测试,我将更新我的发现。

我想我正在寻找的答案是这些症状指向什么以及如何让 chrome/firefox/webkit 正常工作。

此外,Edge 在这里做了哪些其他人没有做的事情?

提前致谢!如果您需要我提供更多信息,请直接询问!我不想让这个问题过载,以防万一有一个简单的答案。

更新: 所以我只是尝试从我的笔记本电脑连接到我的台式机,同样的问题仍然存在。所以令我惊讶的是,这不是本地问题。我有点难过。我可能还必须查看服务器代码。我还被告知尝试使用包装器,如 socket.io,这可能会解决一些平台相关的问题。我之前使用过 Socket.io/Unity,但我不认为我有这些问题(当时我没有在 C# 端运行服务器,在 C# 上似乎没有任何好的 socket.io 服务器实现,我不确定 socket.io 是否与正常接口(interface)网络套接字)。所以这可能表明我在 C# 端的实现存在问题。

最佳答案

所以我想通了,感谢 gman .我查看了他的一些代码并注意到他在他的 WebSocketBehavior 类中使用了一个名为“忽略扩展”的设置。

websocket-sharp 文档是这样说的:

"If it's set to true, the service will not return the Sec-WebSocket-Extensions header in its handshake response."

"I think this is useful when you get something error in connecting the server and exclude the extensions as a cause of the error."

所以我猜那个 header 与 Chrome/Firefox 不兼容。我仍在进行一些测试,但这解决了我在这些浏览器中看到的行为。

因此,如果您遇到类似的错误,请执行此操作!

关于javascript - Websocket 无法在 Chrome/Firefox 上发送/接收消息,在 Microsoft Edge 上工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38822184/

相关文章:

javascript - Chrome 中的 window.onbeforeunload ajax 请求

google-chrome - 通过从本地环境加载 SourceMaps 在生产环境中调试 GWT 应用程序

javascript - 什么是每 CSS 英寸点数和每物理英寸点数

javascript - 使用 jQuery 在第一行后包装括号文本

javascript - HTML5 Canvas 图像绘制与输入文本

c# - 通过 C# 在 Yammer 中发布提要

javascript - 带 Promises 的递归意味着注册的回调被调用多次

c# - 从 Azure 表中删除数据

c# - SqlException 在 C# 中未处理 - 数据库表中的信息

google-chrome - 在 chrome 的新标签页中打开打印预览页面