带有 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 中创建带有可点击选项的水平条形图? [关闭]
带有 AlternateViews 的 ASP.net / C# 电子邮件以显示 HTML 而不是纯文本