高端旅游的网站建设新人跑业务怎么找客户

pingmian/2025/10/13 2:34:56/文章来源:
高端旅游的网站建设,新人跑业务怎么找客户,济南网站建设推荐q479185700强涵,北京中文seo在学习使用websocket之前我们先了解一下websocket#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的通信协议。与HTTP协议不同#xff0c;它允许服务器主动向客户端发送数据#xff0c;而不需要客户端明确地请求。这使得WebSocket非常适合需要实时或持续通信的应…在学习使用websocket之前我们先了解一下websocket WebSocket是一种在单个TCP连接上进行全双工通信的通信协议。与HTTP协议不同它允许服务器主动向客户端发送数据而不需要客户端明确地请求。这使得WebSocket非常适合需要实时或持续通信的应用程序例如在线聊天、实时游戏、股票市场更新等。 websocket介绍 以下是WebSocket的一些关键特点 全双工通信WebSocket允许客户端和服务器在同一时间内彼此发送数据而不需要等待对方的响应。这种实时性使其成为许多实时应用程序的首选协议。 持久连接与HTTP请求-响应模型不同WebSocket连接在客户端和服务器之间保持打开状态直到一方选择关闭连接。这消除了频繁地建立和终止连接的开销。 较低的开销WebSocket在已建立连接的基础上传输数据减少了与每个请求都要建立新连接的HTTP协议的开销。 轻量级标头WebSocket协议的标头数据相对较小这有助于减少数据传输时的开销。 跨域支持WebSocket协议支持跨域通信这意味着您可以在不同域之间建立WebSocket连接。 安全性与HTTP一样WebSocket可以通过使用TLS/SSL来加密通信确保数据的安全性。 要建立WebSocket连接客户端和服务器之间的初始握手是通过HTTP完成的。一旦握手成功连接升级为WebSocket连接允许双方直接交换数据帧。数据帧可以是文本数据或二进制数据具体取决于应用程序的需求。 下面是一个示意性的WebSocket握手过程 客户端发起WebSocket握手请求包含特定的HTTP头信息。 服务器响应握手请求同样包含特定的HTTP头信息。 握手成功后连接从HTTP协议升级到WebSocket协议。 客户端和服务器可以通过发送数据帧进行实时通信直到其中一方关闭连接。 Ajax长轮询介绍 在websocket不被广泛使用之前Ajax的长轮询比较流行本质上两者都是用于实现实时通信的技术但是它们之间有以下区别 连接方式Ajax长轮询使用的是HTTP协议而Websocket使用的是WebSocket协议。 性能Ajax长轮询中客户端需要不断向服务器发送HTTP请求服务器在收到请求后才能返回数据给客户端。这种方式会导致不必要的网络延迟和服务器压力性能相对较差。Websocket采用双向通信方式只需要建立一次连接即可实现实时通信性能较好。 兼容性Ajax长轮询在大多数浏览器中都可以使用但是在一些较老的浏览器中可能会有兼容性问题。Websocket需要浏览器支持HTML5才能使用。 实时性Ajax长轮询的实时性较差因为客户端需要不断向服务器发送请求而服务器在收到请求后才能返回数据。Websocket的实时性较好因为它采用双向通信方式。 完整代码https://download.csdn.net/download/qq_39569480/88264479 websocket用例 后端代码 1.注册服务 首先要在Startup文件中的ConfigureServices方法中注册HttpContextAccessor // This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllers();services.AddSwaggerGen(c {c.SwaggerDoc(v1, new OpenApiInfo { Title WebApplication3, Version v1 });});services.AddHttpContextAccessor();//注册http}其次在Startup文件中的Configure方法中添加wesocket // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseSwagger();app.UseSwaggerUI(c c.SwaggerEndpoint(/swagger/v1/swagger.json, WebApplication2 v1));}app.UseWebSockets();//添加websocketapp.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints {endpoints.MapControllers();});}2.创建服务 首先定义一个Controller或者Service 注入IHttpContextAccessor以便获取socket请求 声明全局变量用于存储socket链接这里没有将socket存储到类似redis或数据库中因为socket链接不能被反序列化如果有更好方法的小伙版可以留言。这里的socket链接池只要服务不停 链接就会一直存在。 [ApiController]public class WebSocketDemoController : ControllerBase{private readonly IHttpContextAccessor _httpContextAccessor;private static Dictionarystring, WebSocket _dic new Dictionarystring, WebSocket();public WebSocketDemoController(IHttpContextAccessor httpContextAccessor){this._httpContextAccessor httpContextAccessor;}}编写socket接口 [HttpGet(“/WsService”)]这里定义了socket的名字 http协议访问时直接通过ws://Ip:Port/WsService去访问 https协议访问时直接通过wss://Ip:Port/WsService去访问 [HttpGet(/WsService)]public async Task Get(){//Logger.LogInformation(CurrentUser.Id CurrentUser.Name);if (_httpContextAccessor.HttpContext.WebSockets.IsWebSocketRequest){//string token _httpContextAccessor.HttpContext.Request.Headers[Sec-WebSocket-Protocol];Console.WriteLine(有链接进入);//接受websocket客户端连接var webSocket await _httpContextAccessor.HttpContext.WebSockets.AcceptWebSocketAsync();//await ReadWriteWebSocektAsync(Add,CurrentUser.Id.ToString(),webSocket); //如果用户的连接不存在加进缓存await Echo(webSocket);}else{//不是websocket客户端请求 ]_httpContextAccessor.HttpContext.Response.StatusCode 400;}}消息处理方法 /// summary/// 对客户端的处理接受消息发送消息关闭连接/// /summary/// param namewebSocket/param/// param namedic/param/// param nameuserId/param/// returns/returnsprivate async Task Echo(WebSocket webSocket){try{var buffer new byte[1024 * 4];//webSocket.SubProtocol token;var result await webSocket.ReceiveAsync(new ArraySegmentbyte(buffer), CancellationToken.None);while (!result.CloseStatus.HasValue){var message Encoding.UTF8.GetString(buffer, 0, buffer.Length);WebSocektDto socketRequest JsonConvert.DeserializeObjectWebSocektDto(message);buffer new byte[1024 * 4];//Logger.LogInformation(${DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)}接收到的信息 message);if (socketRequest.type create_connect){//创建链接 //var (sysUserId, sysUserName) GetSystemUserId(socketRequest.auth);/***************************************//*******重要****看一下下面两行注释******//***************************************///这里只是举了一个简单的示例如果实际应用建议发起者传送token信息 比如上一行解析发起者传过来的token信息 把发起者的id和socket连接保存起来//这里特别说明一下 为什么token信息要通过参数的形式传送而不是直接写到websocket请求的head中是因为websocket不支持head传送信息StoreWebSocekt(Add, socketRequest.sponsorUserId, webSocket);}else if (socketRequest.type dialing){//发起者打电话//Logger.LogInformation(${DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)}发起通话);string targetId socketRequest.receiverUserId;//获取接收者idstring sponsorUserId socketRequest.sponsorUserId;//发起者string sponsorUserName socketRequest.sponsorUserName;//发起者的姓名 //var (sysUserId, sysUserName) GetSystemUserId(socketRequest.auth);//if (string.IsNullOrWhiteSpace(sysUserId)) throw new Exception(请认证);//这一步是确保接收信息方的socket链接是否存在如果不存在信息也找不到接收方//首先在系统登录或者系统初始化时所有的用户都需要建立起链接 并且链接保存起来以便此刻接收响应信息if (_dic.ContainsKey(targetId)){//向客户端发送消息if (_dic.TryGetValue(targetId, out WebSocket ReceiverSocket)){//在我们自定义的链接池中如果找到了接收者的链接 那么我们给接收者发送信息string sponsor socketRequest.sponsorUserId;//获取连接池中的接收者 连接 然后给接收者发送 通话信息WebSocektDto PushMessageDto new WebSocektDto(){type called,//类型可以自己定义 为了方便知道自己的每个链接的作用ok true,msg ,data new ResponseDetailsData { sponsorUserId sponsorUserId, sponsorUserName sponsorUserName, field1 , field2 , field3 }//这里定义了一个实体是用于给接收者传递消息的里边包含发起者的信息和发送的信息};byte[] serverMsg Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(PushMessageDto));await ReceiverSocket.SendAsync(new ArraySegmentbyte(serverMsg, 0, serverMsg.Length), WebSocketMessageType.Text, result.EndOfMessage, CancellationToken.None);}else{//如果在我们自定义的链接池中没有找到接收者的链接 那么我们需要给发起者响应告诉他为什么WebSocektDto rp new WebSocektDto() { type dialing_response, ok false, msg 对方意外断开连接, data new ResponseDetailsData { sponsorUserId null } };byte[] rpJson Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(rp));await webSocket.SendAsync(new ArraySegmentbyte(rpJson, 0, rpJson.Length), WebSocketMessageType.Text, result.EndOfMessage, CancellationToken.None);}}else{//如果在我们自定义的链接池中没有找到接收者 那么我们需要给发起者响应告诉他为什么WebSocektDto rp new WebSocektDto() { type dialing_response, ok false, msg 对方未建立链接, data new ResponseDetailsData { sponsorUserId null } };byte[] rpJson Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(rp));await webSocket.SendAsync(new ArraySegmentbyte(rpJson, 0, rpJson.Length), WebSocketMessageType.Text, result.EndOfMessage, CancellationToken.None);}}//继续接受客户端消息 result await webSocket.ReceiveAsync(new ArraySegmentbyte(buffer), CancellationToken.None);}//关闭释放与客户端连接await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);//await ReadWriteWebSocektAsync(Edit, CurrentUser.Id.ToString(), webSocket); //如果用户的连接不存在加进缓存string keys _dic.Where(q q.Value webSocket).Select(q q.Key).FirstOrDefault();//通过当前socket获取链接池中的key 然后删掉连接池中的链接if (!string.IsNullOrWhiteSpace(keys)) StoreWebSocekt(Edit, keys, webSocket);}catch (Exception e){}}3.完成以上步骤我们进行测试 启动服务 1.创建链接 此步骤为建立socket的连接 并不是实际的工作因为我们需要确保与服务器的socket通信所以先建立连接。 此步骤对应前端的代码 ws new WebSocket(“ws://192.168.0.107:8088”); 在创建ws服务后会自动创建监听 ws.onopen function() { }; 2.让后台保存用户的socket链接 在系统登录时保存起用户的链接方便以后互相发送消息 这里我模拟两个用户登录后台保存其socket链接 3.1122用户给2211用户发送信息 1122用户发送信息 我们回到2211的窗口查看接收到了1122用户发送的信息 当然我们2211也可以给1122回复信息 再回到1122的窗口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设哪些模板号wordpress手机登陆不了

2023年10.13日,下午1点,在北京大红门国际会展中心召开了中国人口文化促进会社区文化推广工作委员会成立暨2024社区春晚文艺活动新闻发布会。来自政府相关部门、社会组织、新闻媒体和公益企业界的相关领导与代表齐聚一堂,共襄盛举。 本次大会由…

php源码织梦网站需要优化

应急响应的基本思路 a. 收集信息:收集告警信息、客户反馈信息、设备主机信息等 b. 判断类型:安全事件类型判断。(钓鱼邮件、Webshll、爆破、中毒等) c. 控制范围:隔离失陷设备 d. 分析研判:根据收集回来的…

网站建设预算计算方法网站建设实验

文章目录 300.最长递增子序列思路代码实现 674. 最长连续递增序列思路代码实现 718. 最长重复子数组思路代码实现 300.最长递增子序列 题目链接 思路 单个字符都是一个长为1的子序列,直接初始化dp为1。先固定一个元素位置i,判断0-i范围内到i的最长子序…

医院网站官方微信精神文明建设网站制作软件下载安装

问题一、canape绘制目标时,二维结构体变量只能录制16个的解决办法 打开ASAP2 Studio 2.6 -Expert 软件。 把该软件中的设置项如下图进行修改。 然后用ASAP2 Studio 2.6 -Expert 软件 打开elf文件导出成A2L文件。 最后关闭该软件。 再在canape工程中重新加载刚才…

如花建站jsp做的网页是网站吗

摘要:基于OpenGL (ES)的跨平台2D/3D游戏开发框架libGDX不仅开源免费,而且具有极为强大的兼容性和高效性,近日,libGDX发布全新1.2.0版本,除修复Bug之外,还新增了OpenGL性能分析、gdx-ai等一系列功能扩展和方…

做网站需要什么编程语言教育网站建设网

160. 相交链表 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向…

邯郸建设网站wordpress ip地址只能访问首页

微服务化的负载均衡组件源码剖析与实战开发全流程 什么是负载均衡负载均衡的种类服务器端负载均衡(S-LB)客户端负载均衡(C-LB)注解LoadBalancedLoadBalancerAutoConfiguration类LoadBalancerClient类源码分析 ServiceInstanceChoo…

国发网站建设中小企业认定证明

Detecting endosperm cracks in soaked maize using μCT technology and R-YOLOv7-tiny 1、模型1.1 C3_TR module(自己提出修改)1.2 CoT block注意力1.3 GhostConv模块2、模型整体流程图3、实验采用r - yolov7微模型和μCT技术对浸水玉米胚乳裂纹进行了检测。提出的ryolov7微…

珠宝网站形象设计广州建筑工程公司名单

程序员生活指南之 【蛀牙】如何选择牙刷,牙膏和牙杯(含其他日常牙具:牙线,漱口水,冲牙器) 文章目录 一、如何选择牙刷,牙膏和牙杯1、如何选择牙刷2、如何选择牙膏3、如何选择牙杯 二、日常牙具&…

网站怎么查询注册商网站建设工

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

企业网站关键词排名什么网站类型

线上会存在一种任务,定时或者手动出发,我们称之为“脚本”,也可以称之为“job” 一、脚本的特性 无过程:只有开始和结束,过程迅速且黑盒。无交互:脚本处理的业务场景都几乎没有交互,只有数据被…

南部县网站建设连连跨境电商网站怎么做

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块二 网络安全事件响应、数字取证调查、应用程序安全 比赛时间及注意事项 本阶段比赛时长为180分钟,时间为13:30-16:30。 【注意事项】 比赛结束,不得关机;选手首先需要…

网站国内服务器租用网站查询地址

/*出处:https://video.100ask.net/p/t_pc/course_pc_detail/column/p_6503fadfe4b064a82f0ab191本专栏一切无特殊声明的知识转述(源码、文字以及图表)版权均归属于百问网,源码仅供学习,请勿用于商业用途;不…

企业网站优化服务商如何韩国视频网站模板下载 迅雷下载地址

前言 首先谢谢好友推荐的这篇论文及代码,前面学习的caffe可能比较浅显,想要深入caffe就可以从这个代码下手了,配置方法还是挺简单的,但是可能会出现部分问题。在作者的论文中有github的地址。注意,本文只介绍如何配置…

企业网站建设平台的功能北京泰达建设有限公司网站

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每…

iis7 默认网站目录seo页面内容优化

4-16: 有人提出一个问题,就是说领导要让在一个什么都没装的linu系统中防止一个文件以供访问,已帮助(https://ask.csdn.net/questions/8089263?spm1001.2014.3001.5501)有人在全屏播放视频的视频上创建一个div悬浮在视…

网站建设与管理教学视频教程做地方网站数据哪里来

1.CGAN原理 生成器,输入的是c和z,z是随机噪声,c是条件,对应MNIST数据集,要求规定生成数字是几。 输出是生成的虚假图片。 判别器的输入是 1.生成器输出的虚假图片x; 2.对应图片的标签c 来自真实数据集,且…

外贸网站模板 外贸网站制作常宁网站开发

https://gitee.com/kekingcn/file-online-preview

免费制作视频的软件有哪些google seo网站 被k

1、自定义方式本地数据缓存 1.1 自定义缓存 1 沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视频文件等。该目录中的文件系统不会…

福州市工程建设质量管理网站用ip访问没有备案的网站

1.执行获取token接口 在结果树这里,使用$符号提取token值。 $根节点,$.data.token表示提取根节点下的data节点下的token节点的值。 2.使用json提取器,提取token 变量路径就是把在结果树提取的路径写上。 3.使用BeanShell取样器或者BeanShell后…