Websocket 无法在 Chrome/Firefox 上 send/receive 消息,在 Microsoft Edge 上工作正常
Websocket can't send/receive messages on Chrome/Firefox, works fine on Microsoft Edge
我正在为 Unity(C#) 制作一个远程调试工具,并且我在游戏中设置了一个 C# WebSocket 服务器来发出日志消息。
远程调试客户端在 JavaScript 中,在由游戏创建的 http 服务器提供的页面上。
我似乎 运行 在某些浏览器上发送消息时遇到问题,我不确定为什么。我是 运行 本地主机上的 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() 函数,在套接字打开后 returns “1”(这应该意味着 open/ready 到 send/receive)。之后,结果如下:
Chrome:
Chrome连接后会立即关闭。我在 onopen() 函数中做的唯一事情是 console.log() 和 send()。如果我删除 send() 那么套接字将保持打开状态。我没有收到来自服务器的任何消息。
Firefox:
即使我在 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 是否与普通的 websockets 接口)。所以这可能表明我在 C# 端的实现存在问题。
所以我想通了,感谢 gman。我查看了他的一些代码并注意到他在他的 WebSocketBehavior class 中使用了一个名为“忽略扩展”的设置。
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 的关系不太好。我仍在进行一些测试,但这解决了我在这些浏览器中看到的行为。
因此,如果您遇到类似的错误,请执行此操作!
我正在为 Unity(C#) 制作一个远程调试工具,并且我在游戏中设置了一个 C# WebSocket 服务器来发出日志消息。
远程调试客户端在 JavaScript 中,在由游戏创建的 http 服务器提供的页面上。
我似乎 运行 在某些浏览器上发送消息时遇到问题,我不确定为什么。我是 运行 本地主机上的 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() 函数,在套接字打开后 returns “1”(这应该意味着 open/ready 到 send/receive)。之后,结果如下:
Chrome:
Chrome连接后会立即关闭。我在 onopen() 函数中做的唯一事情是 console.log() 和 send()。如果我删除 send() 那么套接字将保持打开状态。我没有收到来自服务器的任何消息。
Firefox: 即使我在 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 是否与普通的 websockets 接口)。所以这可能表明我在 C# 端的实现存在问题。
所以我想通了,感谢 gman。我查看了他的一些代码并注意到他在他的 WebSocketBehavior class 中使用了一个名为“忽略扩展”的设置。
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 的关系不太好。我仍在进行一些测试,但这解决了我在这些浏览器中看到的行为。
因此,如果您遇到类似的错误,请执行此操作!