asp.net mvc 通过api来实现websocket通信
程序员文章站
2022-06-11 23:44:55
...
如果要按照本实例来实现websocket通信,那么必须确认iis是8.0版本及以上,因为低版本好像不支持这种实现方式。
- 创建API控制器MessageSendController;
在控制器下创建GET方法来实现websocket的初始化,首选判断前端访问时发是websokcet访问
if (HttpContext.Current.IsWebSocketRequest),如果是就初始化HttpContext.Current.AcceptWebSocketRequest(Websockets);创建Websockets方法用来实现接收和发送消息,具体代码如下
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;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
4,前端代码的
var ws;
var $msg = $("#msged");
var $jdt = $("#jindut");
$(function() {
connec();
});
function connec()
{
//初始化websocket链接
ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/MessageSend");
ws.onopen = function () {
$msg.html("成功连接服务器");
send();
}
ws.onmessage = function (msg) {
var md = $.parseJSON(msg.data);
$msg.html(md.mess);
$jdt.css("width", md.jdt + "%");
$jdt.attr("aria-valuenow", md.jdt);
}
ws.onerror = function (err) {
$msg.html(err);
}
ws.onclose = function () {
$msg.html("连接已经关闭");
}
}
//发送消息到后台
function send() {
// alert(ws.readyState);
if (ws.readyState === WebSocket.OPEN) {
ws.send('@SessionHelper.GetSession(MeSession.UserManageID)');
} else {
$msg.html("链接已经关闭");
}
}
下一篇: MySQL中批量创建日志表信息脚本