【问题标题】:Websocket can't send/receive messages on Chrome/Firefox, works fine on Microsoft EdgeWebsocket 无法在 Chrome/Firefox 上发送/接收消息,在 Microsoft Edge 上运行良好
【发布时间】:2016-12-13 19:32:26
【问题描述】:

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

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

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

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

不管怎样,下面是 JS 代码的 socket 部分:

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

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

Microsoft Edge: 奇怪的是,Edge 工作得很好。我可以接收和发送消息。完全按预期工作。

Node Webkit (nw.js): 我也试图把它写成一个 nw.js 应用程序。可以预见的是,由于它在 chromium(或类似的东西)上运行,它会产生与 Chrome 相同的结果。


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

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

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

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

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

【问题讨论】:

  • 我不知道如何提供帮助,但我在 Unity 中运行了 websockets github.com/greggman/hft-unity3d Chrome 和 Safari 连接没问题并保持连接。我不认为你的问题是 javascript 我认为它是 C#。浏览器在整个网络上运行 websocket。 SO使用websockets。 API 非常简单,没有多少 JavaScript 可以搞砸。另一方面,C# websocket 实现有很多工作要做。我正在使用websocket-sharp
  • 我也在使用 websocket-sharp。我认为项目中的版本与我们的网络库捆绑在一起,所以我可以尝试更新它。我还会看看你的实现,看看我是否做错了什么。谢谢!

标签: javascript c# google-chrome websocket webkit


【解决方案1】:

所以我想通了,感谢gman。我查看了他的一些代码,发现他在 WebSocketBehavior 类中使用了一个名为“Ignore Extensions”的设置。

websocket-sharp 文档有这样的说法:

“如果设置为 true,服务将不会在其握手响应中返回 Sec-WebSocket-Extensions 标头。”

“我认为当您在连接服务器时遇到错误并将扩展排除为错误原因时,这很有用。”

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2017-02-25
    • 2016-08-05
    • 2018-02-04
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多