【发布时间】:2016-12-13 19:32:26
【问题描述】:
我正在为 Unity(C#) 制作一个远程调试工具,并且我在游戏中设置了一个 C# WebSocket 服务器来发出日志消息。
远程调试客户端使用 JavaScript,位于由游戏创建的 http 服务器提供的页面上。
我似乎在某些浏览器上发送消息时遇到了问题,我不知道为什么。我在 localhost 上运行 websocket 服务器并在本地运行客户端,我知道 chrome/firefox 并不真正喜欢这种东西。但奇怪的是,我没有收到任何硬错误或异常。失败似乎无声无息地失败。
我很确定这个问题与 JS/浏览器有关,因为 C# websocket 服务器在所有情况下都能正常工作并接收连接。
不管怎样,下面是 JS 代码的 socket 部分:
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 应用程序。可以预见的是,由于它在 chromium(或类似的东西)上运行,它会产生与 Chrome 相同的结果。
所以我不太确定发生了什么。我不是一个真正的网络程序员,所以复杂的 http 东西并不是我的强项。我真的希望这只是 chrome/firefox 的本地文件问题,如果我连接到外部主机,它会在这些平台上正常工作。明天我将尝试在一些非本地主机服务器上进行测试,我会更新我的发现。
我想我正在寻找的答案是这些症状指向什么以及如何让 chrome/firefox/webkit 正常工作。
Edge 在这里做了哪些其他人没有做的事情?
提前致谢!如果您需要我提供更多信息,请询问!我不想让这个问题过多,以防万一有一个简单的答案。
更新:
所以我只是尝试从我的笔记本电脑连接到我的台式机,但同样的问题仍然存在。所以令我惊讶的是,这不是本地问题。我有点难过。我可能还需要查看服务器代码。我还被告知尝试使用包装器,例如 socket.io,这可能会解决一些平台相关问题。我以前使用过 Socket.io/Unity,但我认为我没有这些问题(当时我没有在C#端运行服务器,C#上似乎没有任何好的socket.io服务器实现,我不确定socket.io接口是否正常网络套接字)。所以这可能表明我在 C# 端的实现存在问题。
【问题讨论】:
-
我不知道如何提供帮助,但我在 Unity 中运行了 websockets github.com/greggman/hft-unity3d Chrome 和 Safari 连接没问题并保持连接。我不认为你的问题是 javascript 我认为它是 C#。浏览器在整个网络上运行 websocket。 SO使用websockets。 API 非常简单,没有多少 JavaScript 可以搞砸。另一方面,C# websocket 实现有很多工作要做。我正在使用websocket-sharp
-
我也在使用 websocket-sharp。我认为项目中的版本与我们的网络库捆绑在一起,所以我可以尝试更新它。我还会看看你的实现,看看我是否做错了什么。谢谢!
标签: javascript c# google-chrome websocket webkit