asp.net mvc 通过api来实现websocket通信

public static List<Models.socketMod> Listws = new List<socketMod>();
private async Task Websockets(AspNetWebSocketContext arg) 
{
	var web = arg.WebSocket;
	while (true) 
	{
		//ArraySegment数组的小抽屉,用于对该数组中元素的范围进行分隔
		ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
		//开始接收
		WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None);
		//判断通信状态是否是打开的
		if (web.State == WebSocketState.Open) 
		{
			string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
			//这里可以自己自定义,我当时是用于前端可以做出停止指令来操作控制后台的任务,所以这样写
			if(message.Contains("停止")) 
			{
				var id = message.Split('|').LastOrDefault()?.ObjTolong();
				var mesd = Listws.FirstOrDefault(p => p.userid == id);
				mesd.isstop = true;
			}
			//这里是接收前端发来的消息,然后做判断的,其中socketMod是自定义的一个实体类,用来存储与客户端连接的信息,比如后台消息要发送到前台时要通过唯一id来在此实体类数组里查找,然后进行指定发送到哪个客户端上,这个可以用来存放在CallContext(线程里唯一)里,这样可以做成简单的聊天器。
			if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong())) 
			{
				var md=new Models.socketMod();
				md.SecWebSocketKey = arg.SecWebSocketKey;
				md.userid = message.ObjTolong();
				md.webst = web;
				Listws.Add(md);
			}
			var mes = new BLL.mescontent();
			mes.jdt = "0";
			mes.mess = "成功连接 :"  + DateTime.Now.ToLongTimeString();
			buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(mes.MToString()));
			//发送消息到前台,这里可以通过调用Listws实体类数组来指定发送或群发
			await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
		} else 
		{
			if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey)) 
			{
				Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey)));
				SessionHelper.SetCach("websockect", Listws);
			}
			break;
		}
	}
}


public static List<Models.socketMod> Listws = new List<socketMod>();
private async Task Websockets(AspNetWebSocketContext arg) 
{
var web = arg.WebSocket;
while (true) 
{
//ArraySegment数组的小抽屉,用于对该数组中元素的范围进行分隔
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
//开始接收
WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None);
//判断通信状态是否是打开的
if (web.State == WebSocketState.Open) 
{
string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
//这里可以自己自定义,我当时是用于前端可以做出停止指令来操作控制后台的任务,所以这样写
if(message.Contains("停止")) 
{
var id = message.Split('|').LastOrDefault()?.ObjTolong();
var mesd = Listws.FirstOrDefault(p => p.userid == id);
mesd.isstop = true;
}
//这里是接收前端发来的消息,然后做判断的,其中socketMod是自定义的一个实体类,用来存储与客户端连接的信息,比如后台消息要发送到前台时要通过唯一id来在此实体类数组里查找,然后进行指定发送到哪个客户端上,这个可以用来存放在CallContext(线程里唯一)里,这样可以做成简单的聊天器。
if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong())) 
{
var md=new Models.socketMod();
md.SecWebSocketKey = arg.SecWebSocketKey;
md.userid = message.ObjTolong();
md.webst = web;
Listws.Add(md);
}
var mes = new BLL.mescontent();
mes.jdt = "0";
mes.mess = "成功连接 :"  + DateTime.Now.ToLongTimeString();
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(mes.MToString()));
//发送消息到前台,这里可以通过调用Listws实体类数组来指定发送或群发
await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
} else 
{
if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey)) 
{
Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey)));
SessionHelper.SetCach("websockect", Listws);
}
break;
}
}
}

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值