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

远程调试客户端使用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:

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

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

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

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

节点Webkit(nw.js):
我还试图将其编写为nw.js应用。可以预见的是,由于它在 Chrome (或类似的东西)上运行,因此产生的结果与Chrome相同。

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

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

此外,Edge在此做什么而其他人则没有?

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

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

最佳答案

因此,我感谢gman弄清楚了。我查看了他的一些代码,发现他在WebSocketBehavior类中使用了一个名为“忽略扩展”的设置。
websocket-sharp文档的内容如下:

因此,我猜想该 header 不能很好地与Chrome / Firefox配合使用。我仍在进行测试,但这解决了我在这些浏览器中看到的行为。
因此,如果您遇到类似的错误,请执行此操作!

09-25 19:50