WebSockets 草案的问题
Posted
技术标签:
【中文标题】WebSockets 草案的问题【英文标题】:Problem with WebSockets Draft 【发布时间】:2011-05-03 01:16:36 【问题描述】:我在使用 Web Sockets 和 Microsoft 的 Draft 实现时遇到了一些问题。我正在使用他们为服务器提供的 API,以及对本身不支持 Web 套接字的浏览器的 Silverlight 修复。我正在处理的信息来自http://channel9.msdn.com/Events/MIX/MIX11/HTM10 和http://html5labs.interoperabilitybridges.com/prototypes/websockets/websockets/info 我的代码编译正常,它开始打开连接,然后失败。这是我的后端服务器代码(在 C# 控制台应用程序中)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ServiceModel.WebSockets;
namespace ChatBackend
class Program
static void Main(string[] args)
var host = new WebSocketsHost<MessageHandler>();
host.AddWebSocketsEndpoint("ws://localhost:4502/MessageHandler");
host.Open();
Console.ReadLine();
这是 MessageHandler 类:
class MessageHandler : WebSocketsService
public override void OnMessage(string value)
string returnMessage = "You just said '" + value + "'";
Console.WriteLine(value);
SendMessage(returnMessage);
这个后端部分似乎工作正常。这是客户端:
$(document).ready(function ()
setTimeout(connect, 2050);
);
function connect()
websocket = new WebSocketDraft("ws://localhost:4502/MessageHandler");
websocket.onopen = function()
websocket.send("test");
;
websocket.onclose = function ()
alert("DIED");
;
websocket.onmessage = function(event)
sendMessage(new message(0, event.data, 0));
;
编辑:我检查了我的防火墙并允许了我正在使用的端口。现在连接只是挂起 - 它没有关闭,也没有打开。有什么想法吗?
编辑 2:我做了更多研究,结果发现我需要删除 clientaccesspolicy.xml。事实证明我从未拥有过它,但我返回的是自定义 302 重定向而不是 404 未找到。解决了这个问题,但没有进展。它只是挂起。
编辑 3:尝试关闭防病毒和防火墙,没有变化 谢谢 - 如果我需要更多代码或信息,请告诉我。
【问题讨论】:
您是否有防病毒或自定义代理,只是出于兴趣?另外,如果你有它,如果你通过 Visual Studio 添加对该 Web 服务的引用会发生什么?当它试图处理它时,你可能会得到一个更好的错误...... @Russ C 除了提琴手之外没有自定义代理 - 当我关闭提琴手时它仍然不起作用。 anti-virus - MS Security Essentials,它不应该篡改我的端口或任何东西。 应该不会,但是不知道它是否知道WS://协议? @Russ 尝试将其关闭 - 没有变化。 :-\ 【参考方案1】:你可以使用 Firebug 或其他东西并在 jquery.slws.js 中的这一行上放置一个断点(假设它是你正在使用的那个!)
this.slws = slCtl.Content.services.createObject("websocket");
然后单步执行,看看哪里失败了?
【讨论】:
根据视频(原始问题中的链接)实例化 websocket 对象确实打开它。我正在扫描视频以查找我可能犯的任何错误。 当套接字打开时,他会发送一条消息。我假设创建一个新的 websocket 会打开连接。 只是在我从他的链接中看到的代码sn-p中,.send在onxxx之外被调用。 .send 用于实际将一些数据发送到流中 - 它与打开它不同。一旦连接打开,我就会尝试调用它 - 它似乎永远不会这样做。 是的,很抱歉 - 刚刚查看了插件并更新了我的答案。【参考方案2】:您的网址绝对看起来与您服务器端的设置相匹配。真的很难找到任何实际使用 WebSockets 的例子,因为它仍然是一项新技术,但从我能找到的唯一工作示例(它在 html5labs 网站上)中,我想也许你正在尝试在它完成打开之前写入套接字。在我找到的示例中,看起来他们检查了套接字的 readyState 属性,并且仅在 readyState === 1 时尝试send
。该示例中的套接字通过绑定$(document).ready
事件打开,然后发送通过单击按钮调用。
【讨论】:
感谢 Joel - 但它似乎不起作用 - onclose 在 onopen 之前被调用,而我发送数据的尝试在 onopen 内部。另外,我关注的视频(在上面的问题中)也没有使用这个 readyState 属性......这真的很奇怪。我跟着视频完美。【参考方案3】:终于搞定了!原来我必须将 clientaccesspolicy.xml 添加到我服务器上默认网站的根文件夹中。我以为我必须删除它 - 我误读了一些信息并立即忘记了它。故事的寓意:阅读自述文件!
【讨论】:
以上是关于WebSockets 草案的问题的主要内容,如果未能解决你的问题,请参考以下文章