0

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

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

4

2 回答 2

1

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

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

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

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

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

于 2012-07-03T12:27:40.343 回答
1

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

于 2012-07-06T06:10:46.477 回答