簡體   English   中英

Websocket無法在Chrome / Firefox上發送/接收消息,在Microsoft Edge上運行正常

[英]Websocket can't send/receive messages on Chrome/Firefox, works fine on Microsoft Edge

我正在為Unity(C#)制作一個遠程調試工具,我在游戲中設置了一個發送Log消息的C#WebSocket服務器。

遠程調試客戶端使用JavaScript,在由也由游戲創建的http服務器提供服務的頁面上。

我似乎遇到了在某些瀏覽器上發送消息的問題,我不知道為什么。 我在localhost上運行websocket服務器並在本地運行客戶端,我知道chrome / firefox並不喜歡那種東西。 但奇怪的是,我沒有得到任何硬錯誤或異常。 失敗似乎無聲無息。

我非常肯定問題是JS / Browser相關,因為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會立即關閉。 我在onopen()函數中唯一做的是console.log()和send()。 如果我刪除send(),那么套接字將保持打開狀態。 我沒有從服務器收到任何消息。

Firefox:即使我在onopen()中調用send()函數,Firefox也會無限期地保持套接字打開。 但是,服務器不會從客戶端收到任何消息,反之亦然。 我覺得我設法先發送客戶端 - >服務器,但我在測試這個問題時無法重現。

Microsoft Edge:奇怪的是, Edge運行得很好。 我可以接收和發送消息。 完全符合預期。

Node Webkit(nw.js):我也試圖把它寫成一個nw.js應用程序。 可以預見的是,由於它運行在鉻(或一些googly)上,它產生的結果與Chrome相同。


所以我不確定發生了什么。 我不是一個真正的網絡程序員,所以復雜的http東西並不是我真正的強項。 我真的希望它只是chrome / firefox的本地文件問題,並且如果我連接到外部主機,它將在這些平台上正常工作。 我將嘗試在明天與一些非localhost服務器一起測試這個,我會用我的發現更新。

我想我正在尋找的答案是這些症狀指向的,以及我如何讓chrome / firefox / webkit正常工作。

Edge還做了什么,其他人沒有?

提前致謝! 如果您需要我的更多信息,請詢問! 我不想重復這個問題,以防有一個簡單的答案。

更新:所以我只是嘗試從筆記本電腦連接到我的桌面,同樣的問題仍然存在。 所以令我驚訝的是,這不是一個本地問題。 我有點難過。 我可能還需要查看服務器代碼。 我也被告知要嘗試使用一個包裝器,比如socket.io,這可能會解決一些與平台相關的問題。 之前我曾經使用過Socket.io/Unity,但我認為我沒有遇到這些問題 (我當時沒有在C#端運行服務器,似乎沒有任何好的socket.io服務器在C#上實現,我不確定socket.io是否與普通的websockets接口。 這可能表明我在C#端的實現存在問題。

所以我想通了,感謝格曼 我查看了他的一些代碼並注意到他在他的WebSocketBehavior類中使用了一個名為“Ignore Extensions”的設置。

websocket-sharp文檔有這樣的說法:

“如果設置為true,服務將不會在其握手響應中返回Sec-WebSocket-Extensions標頭。”

“我認為當你在連接服務器時出現錯誤並將擴展名排除為導致錯誤時,這很有用。”

所以我猜這個標題與Chrome / Firefox並不相符。 我還在做一些測試,但這解決了我在這些瀏覽器中看到的行為。

所以如果你得到類似的錯誤,那就去做吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM