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

时间:2012-07-03 10:10:43

标签: asp.net html5 websocket

如何使用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>

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

这增加了合理的工作量。您可能会发现使用现有的开源服务器更快。我自己没有使用它,但Fleck似乎很受欢迎,看起来应该很容易使用。

答案 1 :(得分:1)

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