Websocket无法在Chrome / Firefox上发送/接收消息,在Microsoft Edge

时间:2016-08-08 06:01:57

标签: javascript c# google-chrome websocket webkit

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

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

我似乎遇到了在某些浏览器上发送消息的问题,我不知道为什么。我在localhost上运行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"套接字打开后(这应该意味着打开/准备发送/接收)。之后,结果如下:

铬:

Immediately Closes after sending a message.

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

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

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

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

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

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

Edge在这里做的其他人没有做什么?

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

更新 所以我只是尝试从笔记本电脑连接到我的桌面,同样的问题仍然存在。所以令我惊讶的是,这不是一个本地问题。我有点难过。我可能还需要查看服务器代码。我也被告知要尝试使用一个包装器,比如socket.io,这可能会解决一些与平台相关的问题。我之前和Socket.io/Unity一起工作过,但我并没有这样做过。我认为我遇到了这些问题(我当时没有在C#端运行服务器,在C#上似乎没有任何好的socket.io服务器实现,我和# 39;我不确定socket.io是否与普通的websockets接口。所以这可能表明我在C#端的实现存在问题。

1 个答案:

答案 0 :(得分:1)

所以我想通了,感谢gman。我查看了他的一些代码并注意到他在他的WebSocketBehavior类中使用了一个名为" Ignore Extensions"的设置。

websocket-sharp文档可以这样说:

  

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

     

"我认为当您在连接服务器时出现错误并将扩展名排除为导致错误时,这非常有用。"

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

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