我正在为 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:
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/