分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

HTML5示例之WebSocket

发布时间:2023-09-06 01:37责任编辑:苏小强关键词:HTMLWeb

Web应用程序通常有一些耗时的操作,但耗时不是很长,一分钟之内能完成的。如果采用后台任务队列去异步处理,这样的用户不能实时看到后台处理的情况。倘若用户触发操作后,Web页面能够实时看到后台处理的进度,并且返回实时的状态,用户等待起来是不是感觉非常棒。

1.前端页面和脚本

页面包含一个文本框和一个【提交】按钮,文本框输入后台要返回的消息数。

<h2>WebSocket</h2><div class="form-inline"> ???<div class="form-group"> ???????<label for="count">消息数</label> ???????<input type="text" class="form-control" id="count" placeholder="服务端返回的消息数"> ???</div> ???<button class="btn btn-primary" onclick="wsTest()">提交</button></div><blockquote> ???<ol id="msg"></ol></blockquote>

WebSocket的api很简单,如下示例封装了一个简单的操作。

var WsUtil = { ???msg: document.getElementById('msg'), ???ws: null, ???connect: function (url, callback) { ???????var _this = this; ???????_this.msg.innerHTML = ''; ???????_this.appendMsg('正在连接......', '#00f'); ???????_this.ws = new WebSocket(url); ???????_this.ws.onopen = function () { ???????????_this.appendMsg('客户端已连接', '#00f'); ???????????if (callback) { ???????????????callback(_this.ws); ???????????} ???????} ???????_this.ws.onmessage = function (evt) { ???????????_this.appendMsg(evt.data); ???????} ???????_this.ws.onclose = function () { ???????????_this.appendMsg('客户端已断开连接', '#00f'); ???????} ???????_this.ws.onerror = function (evt) { ???????????_this.appendMsg(evt.data, '#f00'); ???????} ???}, ???close: function () { ???????if (this.ws) { ???????????this.ws.close(); ???????????this.ws = null; ???????} ???}, ???appendMsg: function (message, color) { ???????var li = document.createElement('li'); ???????li.style.color = color || '#000'; ???????li.innerHTML = message; ???????msg.appendChild(li); ???}}function wsTest() { ???var count = document.getElementById('count').value; ???var url = 'ws://localhost:90/html5/wstask?count=' + count; ???WsUtil.connect(url, function (ws) { ???????ws.send('test'); ???});}

2.ASP.NET MVC后端实现WebSocket请求

ASP.NET MVC控制器

public class Html5Controller : Controller{ ???public void WsTask() ???{ ???????HttpContext.AcceptWebSocketRequest(ctx => ???????{ ???????????int.TryParse(ctx.QueryString["count"], out int count); ???????????return WebSocketManager.RunTask(ctx, wsm => ???????????{ ???????????????for (int i = 0; i < count; i++) ???????????????{ ???????????????????var message = string.Format("{0:yyyyMMdd HH:mm:ss} 消息{1}", DateTime.Now, i + 1); ???????????????????wsm.SendMessageAsync(message); ???????????????????Thread.Sleep(1000); ???????????????} ???????????}); ???????}); ???}}

这里封装了一个WebSocket管理者类。

public class WebSocketManager{ ???private WebSocket socket; ???public WebSocketManager() ???{ ???} ???public WebSocketManager(WebSocket socket) ???{ ???????this.socket = socket; ???} ???public static async Task RunTask(AspNetWebSocketContext context, Action<WebSocketManager> action) ???{ ???????var socket = context.WebSocket; ???????if (socket.State == WebSocketState.Open) ???????{ ???????????var wsm = new WebSocketManager(socket); ???????????try ???????????{ ???????????????action(wsm); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????await wsm.SendMessageAsync(ex.Message); ???????????} ???????} ???} ???public Task SendMessageAsync(string message) ???{ ???????var content = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message)); ???????return socket.SendAsync(content, WebSocketMessageType.Text, true, CancellationToken.None); ???}}

运行效果

HTML5示例之WebSocket

原文地址:https://www.cnblogs.com/known/p/8319087.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved