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 草案的问题的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 websockets vs PHP websockets vs node.js websockets?

Websockets 和可扩展性

通过 WebSockets 同步对象时出现问题?

Websockets:命名服务器的含义?

Websockets 比 WebRTC 快?

结合 websockets 和 http