我正在为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"套接字打开后(这应该意味着打开/准备发送/接收)。之后,结果如下:
铬:
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#端的实现存在问题。
答案 0 :(得分:1)
所以我想通了,感谢gman。我查看了他的一些代码并注意到他在他的WebSocketBehavior类中使用了一个名为" Ignore Extensions"的设置。
websocket-sharp文档可以这样说:
"如果设置为true,则服务不会在其握手响应中返回Sec-WebSocket-Extensions标头。"
"我认为当您在连接服务器时出现错误并将扩展名排除为导致错误时,这非常有用。"
所以我猜这个标题与Chrome / Firefox并不相符。我还在做一些测试,但这解决了我在这些浏览器中看到的行为。
因此,如果您遇到类似错误,请执行此操作!