原生Websocket在.Net环境的实现
我使用原生的websocket做了个简单的demo,适合初学的知道怎么个实现。
我参考的是网上的,部分雷同,见谅
(聊天室功能可以在此基础上加工,我后面会在SignalR框架中实现)
下面是大致的代码框架,实现是加上自己的业务的,我会在后面提供我的源代码,丰富了框架,一个简单的demo
一、前端Html中的Js
var socket;//创建websocket对象
$(document).ready(function(){
//创建链接,打开连接。使用ws协议,如果报错注意IIS版本,至少IIS8(我不太确定)
socket = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/App/webSocketHandler.ashx');
socket.onopen = function (event) {
//监控websocket打开的方法
}
socket.onclose = function (event) {
//监控服务器关闭websocket的方法
//浏览器关闭时、url跳转时,服务器会接收到当前websocket关闭的通知 }
socket.onerror = function (event) {
//监控websocket关闭的方法
} socket.onmessage = function (event) { //接收到服务器消息,具体信息是json格式,在event的data中。 } })
function sendMsg(msg){ //发送消息到服务器
if (socket.readyState == WebSocket.OPEN) {socket.send(msg);
}
}
二、前端Html中的html、css,略,看我源代码
三、后台处理程序
public class webSocketHandler : IHttpHandler
{
//获取Dal层的websocket列表,当前每个请求视为一个websocket对象,进来保存,离开移除。
public static List<WebSocket> lstWs = WebSocketHelper.lstWs;
public void ProcessRequest(HttpContext context)
{
if (context.IsWebSocketRequest)
{
context.AcceptWebSocketRequest(ProcessChat);
}
}
//一个异步线程
private async Task ProcessChat(AspNetWebSocketContext context)
{
string rspMsg = string.Empty;
WebSocket socket = context.WebSocket;//获取当前的websocket对象
lstWs.Add(socket);//加入当前的websocket对象
//while不会进入死循环
while (true)
{
if (socket.State == WebSocketState.Open)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
//当接收到浏览器关闭、url跳转、报错等问题,服务器会接收到websocket关闭通知
if (result.MessageType == WebSocketMessageType.Close)
{
//异步关闭websocket连接
await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);
lstWs.Remove(socket);
break;
}
//这里打断点调试,你会发现while程序不会死循环,直到下面的方法收到信息,或者上面接收到关闭
string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
rspMsg = DateTime.Now.ToLongTimeString() + " 你发送了:" + userMsg;
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(rspMsg));
//发送到当前用户的客户端
await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
else
{
break;
}
}
}
//DAL层的程序
public class WebSocketHelper
{
public static List<WebSocket> lstWs = new List<WebSocket>();
/// <summary>
/// 封装推送消息,然后发送给每位在线的
/// </summary>
/// <param name="json">json格式推送内容</param>
public void Push2EveryOne(string json = "")
{
//封装推送消息,然后发送给每位在线的
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(json));
foreach (WebSocket socket in lstWs)
{
socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
}
我做了个简单的demo,看下截图,里面稍微丰富了下,有兴趣下载源码(MVC4.5)