带有 C# 实现的 ASP.NET HTML5 WebSockets

Posted

技术标签:

【中文标题】带有 C# 实现的 ASP.NET HTML5 WebSockets【英文标题】:ASP.NET HTML5 WebSockets with C# implementation 【发布时间】:2012-07-03 10:10:42 【问题描述】:

如何使用 ASP.NET 4.0 (C#) 创建简单的 html5 Websockets 应用程序。 我的问题是关于创建 Websockets。以下是尝试过的代码...

try

    var listener = new TcpListener(IPAddress.Loopback, 9988);
    listener.Start();                
    using (var client = listener.AcceptTcpClient())
    using (var stream = client.GetStream())
    using (var reader = new StreamReader(stream))
    using (var writer = new StreamWriter(stream))
    
        writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
        writer.WriteLine("Upgrade: WebSocket");
        writer.WriteLine("Connection: Upgrade");
        writer.WriteLine("WebSocket-Origin: http://localhost:9988");
        writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
        writer.WriteLine("");
    
    listener.Stop();

catch (Exception ex)

    ClientScript.RegisterClientScriptBlock(this.GetType(), "", ex.Message);

而HTML代码如下...!

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <script type="text/javascript">
        var status = '';
        function conStatus(state) 
            return (state == 0) ? 'Connecting..!' : (state == 1) ? 'Opened..!' : (state == 2) ? 'Closing..!' : 'Closed..!';
        
        function WebSocketTest() 
            if ("WebSocket" in window) 
                try 
                    debugger;
                    var connection = new WebSocket('ws://localhost:9988');
                    status += '<br/>Socket Status: ' + conStatus(connection.readyState);

                    connection.onopen = function () 
                        status += 'Socket Opened..!';
                    ;

                    connection.onmessage = function () 
                        status += 'Socket received a message..!';
                    ;
                    connection.onclose = function () 
                        status += 'Socket Closed..!';
                    ;
                    connection.send('Hello World..!');
                
                catch (exception) 
                    status += '<br/>EXCEPTION: ' + exception;
                
            
            else 
                status += "Your Browser does not support WebSockets...!"
            
            document.write(status);
        
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div id="sse">
        <a href="javascript:WebSocketTest()">Run WebSocket</a>
    </div>
    <div id="status">
    </div>
    </form>
</body>
</html>

如果我运行这个文件,页面会继续加载..我看不到任何结果..!请给我一个解决方案....提前谢谢....

【问题讨论】:

实际上并没有回答你的问题,但你SignalR 吗?我相信它支持 WebSocket 通信,并且可以为您包装管道 他要求 .NET 4.0 ... SignalR 需要 4.5 和 IIS8 用于 websocket 【参考方案1】:

您需要对服务器进行一些更改。最好从阅读规范的handshaking 部分开始。至少,您需要在响应中添加一个 Sec-WebSocket-Accept 标头。您也可以考虑在客户端请求中检查 Sec-WebSocket-Version 和 Sec-WebSocket-Protocol。

在此之后,您应该拥有一台服务器,该服务器将完成其握手然后立即关闭其连接。您应该让您的 tcp 客户端无限期地保持活动状态,仅在客户端关闭或请求关闭或服务器想要关闭时关闭它。

您还需要更新您的客户端代码。 new WebSocket(...) 提示的初始握手是异步的。在onopen 回调运行之前,您不能使用连接变量(因此将connection.send('Hello World..!') 行移到那里)。

之后,您应该阅读规范的data framing 部分以了解如何发送/接收消息。

这加起来是一个合理的工作量。您可能会发现改用现有的开源服务器会更快。我自己没用过,但Fleck 似乎很受好评,看起来应该很容易使用。

【讨论】:

【参考方案2】:

Websocket 实现需要的不仅仅是一个简单的 TcpListener。您可以尝试PokeIn,以便在所有平台上都支持 WebSocket,或者您可以将您的解决方案更新到 ASP.NET 4.5 并坚持使用 IIS 8

【讨论】:

以上是关于带有 C# 实现的 ASP.NET HTML5 WebSockets的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C#、ASP.NET、SQL Server 端处理实现 jQuery DataTables 插件?

如何在 ASP .net MVC 4 应用程序的 HTML5 中创建带有可点击选项的水平条形图? [关闭]

asp.net中radiobutton 的问题 C#

带有 AlternateViews 的 ASP.net / C# 电子邮件以显示 HTML 而不是纯文本

带有 C# asp.net 的 GCM 推送通知在 android 设备中提供 null 作为通知

c#中winform是用啥语言编写?