.NET高级面试指南专题七【SocketWebSocket】

在这里插入图片描述

Socket(套接字)是一种在计算机网络中实现通信的一种机制,它提供了一种标准的接口,使不同计算机上的程序能够通过网络进行数据交换。Socket允许在网络中的不同设备之间建立连接,进行双向的数据传输。
Socket通常用于实现客户端-服务器模型,其中一个程序充当服务器,等待其他程序(客户端)连接并进行通信。这种模型是许多网络应用的基础,如网页浏览器与服务器之间的通信、即时通讯软件等。

一般来说,Socket通信的基本流程如下:

服务器程序创建一个Socket并绑定到一个特定的端口,然后开始监听客户端的连接请求。
客户端程序创建一个Socket,并尝试连接到服务器的IP地址和端口。 一旦连接建立,数据可以在服务器和客户端之间进行双向传输。

在这里插入图片描述
Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。

在这里插入图片描述
一个简单的C# Socket代码示例
展示了一个基本的服务器和客户端通信。这个例子使用了同步的阻塞方式,真实的应用中可能需要考虑使用异步编程以提高性能。

服务器端代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class Server
{static void Main(){TcpListener server = null;try{// 设置IP地址和端口IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 12345;// 创建TcpListener对象server = new TcpListener(ipAddress, port);// 开始监听server.Start();Console.WriteLine("等待客户端连接...");// 接受连接请求TcpClient client = server.AcceptTcpClient();Console.WriteLine("客户端已连接");// 获取网络流NetworkStream stream = client.GetStream();// 发送和接收数据byte[] data = new byte[256];int bytesRead;while ((bytesRead = stream.Read(data, 0, data.Length)) != 0){string message = Encoding.ASCII.GetString(data, 0, bytesRead);Console.WriteLine($"接收到消息: {message}");// 回复客户端string response = "服务器已收到消息";byte[] responseData = Encoding.ASCII.GetBytes(response);stream.Write(responseData, 0, responseData.Length);}// 关闭连接client.Close();}catch (Exception ex){Console.WriteLine($"发生异常: {ex.Message}");}finally{// 停止监听server.Stop();}}
}

客户端代码:

using System;
using System.Net.Sockets;
using System.Text;class Client
{static void Main(){try{// 设置服务器的IP地址和端口TcpClient client = new TcpClient("127.0.0.1", 12345);Console.WriteLine("连接到服务器");// 获取网络流NetworkStream stream = client.GetStream();// 发送数据string message = "Hello, server!";byte[] data = Encoding.ASCII.GetBytes(message);stream.Write(data, 0, data.Length);Console.WriteLine($"发送消息: {message}");// 接收服务器的响应data = new byte[256];int bytesRead = stream.Read(data, 0, data.Length);string response = Encoding.ASCII.GetString(data, 0, bytesRead);Console.WriteLine($"服务器响应: {response}");// 关闭连接client.Close();}catch (Exception ex){Console.WriteLine($"发生异常: {ex.Message}");}}
}

WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的通信协议,它使得客户端和服务器之间可以实时地进行双向数据传输。WebSocket通常用于实现实时的Web应用程序,如在线聊天、实时协作编辑和实时通知等。

WebSocket出现的原因,哪些因素触发产生WebSocket

以前网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力通常是采用轮询、Comet技术解决。
HTTP协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询在特定的时间间隔(如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器。这样的方法最明显的缺点就是需要不断的发送请求,而且通常HTTP
request的Header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带。

下面是WebSocket的一些关键特点和工作原理:

特点:

  • 全双工通信: WebSocket允许客户端和服务器之间进行双向实时通信,而不需要每次通信都创建新的连接。

  • 低延迟: 由于使用了单个TCP连接,WebSocket相对于一些传统的轮询技术来说,具有更低的延迟。

  • 轻量级: WebSocket协议相对简单,数据帧的头部开销小,降低了通信的开销。

  • 协议标准化: WebSocket协议已经被标准化,有相关的RFC文档(RFC 6455),这使得不同平台和语言之间能够进行兼容性的实现。

工作原理:

  • 握手阶段: 在建立WebSocket连接之前,客户端首先通过HTTP发送一个特殊的请求,包含WebSocket版本信息和一些其他头部信息。服务器在接收到这个请求后,如果支持WebSocket,就会响应一个类似的包含协议升级请求的HTTP响应。

  • 建立连接: 客户端和服务器之间的握手成功后,连接从HTTP协议升级到WebSocket协议。此时,客户端和服务器可以在同一个TCP连接上发送和接收WebSocket数据帧。

  • 双向数据传输: 一旦连接建立,客户端和服务器可以在任何时候通过发送WebSocket数据帧来实时交换信息。数据帧可以是文本、二进制等。

  • 关闭连接: 当通信结束时,任何一方都可以发送一个特殊的帧(Close Frame)来关闭WebSocket连接。另一方接收到该帧后也发送一个带有关闭码的响应帧,然后双方都关闭连接。

WebSocket在实时性要求较高的应用场景中非常有用,因为它提供了一种高效、低延迟的双向通信方式,适用于Web应用中需要实时性和即时通信的各种情境。

在C#中,可以使用.NET Core的System.Net.WebSockets库来实现WebSocket通信。以下是一个简单的C# WebSocket服务器和客户端的代码示例:
服务器端代码:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;class WebSocketServer
{public static async Task StartServerAsync(string ipAddress, int port){HttpListener listener = new HttpListener();listener.Prefixes.Add($"http://{ipAddress}:{port}/");listener.Start();Console.WriteLine($"WebSocket server listening on http://{ipAddress}:{port}/");while (true){HttpListenerContext context = await listener.GetContextAsync();if (context.Request.IsWebSocketRequest){ProcessWebSocketRequest(context);}else{context.Response.StatusCode = 400;context.Response.Close();}}}private static async void ProcessWebSocketRequest(HttpListenerContext context){WebSocket webSocket = await context.AcceptWebSocketAsync(null);Console.WriteLine("WebSocket connection established");byte[] buffer = new byte[1024];WebSocketReceiveResult result;do{result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);if (result.MessageType == WebSocketMessageType.Text){string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"Received message: {receivedMessage}");// Echo the message back to the clientawait webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), WebSocketMessageType.Text, true, CancellationToken.None);}}while (!result.CloseStatus.HasValue);await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);Console.WriteLine("WebSocket connection closed");}static void Main(){StartServerAsync("127.0.0.1", 8080).Wait();}
}

客户端代码:

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;class WebSocketClient
{public static async Task StartClientAsync(string serverUri){using (ClientWebSocket webSocket = new ClientWebSocket()){await webSocket.ConnectAsync(new Uri(serverUri), CancellationToken.None);Console.WriteLine("Connected to WebSocket server");Task receiveTask = ReceiveMessageAsync(webSocket);// Sending a sample messagestring message = "Hello, server!";byte[] messageBytes = Encoding.UTF8.GetBytes(message);await webSocket.SendAsync(new ArraySegment<byte>(messageBytes), WebSocketMessageType.Text, true, CancellationToken.None);// Keep the application runningConsole.ReadLine();}}private static async Task ReceiveMessageAsync(ClientWebSocket webSocket){byte[] buffer = new byte[1024];while (webSocket.State == WebSocketState.Open){WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);if (result.MessageType == WebSocketMessageType.Text){string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"Received message: {receivedMessage}");}}}static void Main(){StartClientAsync("ws://127.0.0.1:8080").Wait();}
}

WebSocket 和Socket的区别
WebSocket和Socket是两种不同的通信机制,有一些关键的区别:

  1. 协议层次: WebSocket: 是一种在应用层实现的协议,建立在HTTP协议之上。它通过HTTP协议的握手阶段升级到WebSocket协议,实现了全双工通信。
    Socket: 是一种通用的套接字编程接口,可以在应用层之下的传输层(通常是TCP或UDP)直接进行数据交换。
  2. 双向通信: WebSocket: 支持全双工通信,允许客户端和服务器之间同时进行数据的发送和接收。 Socket: 也支持全双工通信,但需要在编程中明确实现。
  3. 协议解析: WebSocket: 使用标准的WebSocket协议,帧格式和握手机制都被协议规范明确定义。 Socket: 在传输层(TCP或UDP)上,应用程序需要自行定义通信协议和数据格式。
  4. 通信开销: WebSocket: 握手阶段的开销相对较大,但一旦建立连接,数据帧的头部相对较小,通信开销较低。 Socket: 不需要握手,但需要应用程序自行管理通信协议,可能会有较大的通信开销。
  5. 应用场景: WebSocket: 适用于Web应用中需要实时性和即时通信的场景,如在线聊天、实时协作编辑等。 Socket: 更通用,适用于各种应用场景,包括文件传输、远程控制等。
  6. 跨域支持:
    WebSocket: 由于WebSocket协议是在HTTP协议上升级而来,因此支持跨域通信。
    Socket: 在一些环境中可能需要专门的处理来支持跨域通信。

总体而言,WebSocket是一种高层次的通信协议,针对实时性和双向通信进行了优化,适用于Web应用中。Socket是一种通用的套接字编程接口,可以灵活地实现各种通信需求,但需要应用程序自行管理通信协议。选择WebSocket还是Socket取决于具体的应用需求和环境。

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

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

相关文章

Ubuntu如何使用宝塔面板部署开源论坛HadSky并结合内网穿透远程访问?

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中&#xff0c;有三种类型的数组&#xff1a; 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组&#xff0c;每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

耳机壳UV树脂制作私模定制耳塞适合什么样的人使用呢?

耳机壳UV树脂制作私模定制耳塞适合以下人群使用&#xff1a; 对音质要求高的人&#xff1a;私模定制耳塞能够完美契合用户的耳朵形状&#xff0c;减少漏音和外部噪音的干扰&#xff0c;提供更好的音质体验。需要长时间佩戴耳机的人&#xff1a;私模定制耳塞能够提高佩戴舒适度…

<网络安全>《30 常用安全标准》

《常用安全标准》 1 个人信息安全 o《信息安全技术 个人信息安全规范》&#xff08;GB/T35273-2017) o《信息安全技术 个人信息去标识化指南》&#xff08;GB/T37964-2019) 2 工业控制安全 o《信息安全技术 工业控制系统安全检查指南》&#xff08;GB/T 37980-2019) o《信息…

Git基础命令,分支,标签的使用【快速入门Git】

Git基础命令&#xff0c;分支&#xff0c;标签的使用【快速入门Git】 Git基础常用命令Git工作流程工作区&#xff0c;暂存区和版本库文件状态获取Git仓库 git init | git clone查看文件状态 git status暂存已修改的文件 git add 查看已暂存和未暂存的修改 git diff提交文件更改…

【JAVA】类加载机制

目录 一、快速梳理JAVA类加载机制 1、JDK8的类加载体系 2、沙箱保护机制 3、Linking链接过程 二、一个用类加载机制加薪的故事 三、通过类加载器引入外部Jar包 四、自定义类加载器实现Class代码混淆 五、自定义类加载器实现热加载 六、打破双亲委派&#xff0c;实现同类…

VBA技术资料MF118:在多个工作表中插入页眉和页脚

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

多模态论文串讲·下【论文精读·49】最近使用 transformer encoder 和 decoder 的一些方法

大家好&#xff0c;我们今天就接着上次多模态串讲&#xff0c;来说一说最近使用 transformer encoder 和 decoder 的一些方法。 1 BLIP&#xff1a;Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 我们要过的第一篇论文…

计算机网络——11EMail

EMail 电子邮件&#xff08;EMail&#xff09; 3个主要组成部分 用户代理邮件服务器简单邮件传输协议&#xff1a;SMTP 用户代理 又名“邮件阅读器”撰写、编辑和阅读邮件输入和输出邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户的邮件输出报文队列保持待发…

LeetCode、435. 无重叠区间【中等,贪心 区间问题】

文章目录 前言LeetCode、435. 无重叠区间【中等&#xff0c;贪心 区间问题】题目链接及分类思路贪心、区间问题 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技…

08:K8S资源对象管理|服务与负载均衡|Ingress

K8S资源对象管理&#xff5c;服务与负载均衡&#xff5c;Ingress DaemonSet控制器污点策略容忍容忍污点 其他资源对象Job资源对象 有限生命周期CronJob资源对象 集群服务服务自动发现headless服务 实现服务定位与查找 服务类型 Ingress插件 发布服务的方式 DaemonSet控制器 Da…

Elasticsearch:适用于 iOS 和 Android 本机应用程序的 Elastic APM

作者&#xff1a;来自 Elastic Akhilesh Pokhariyal, Cesar Munoz, Bryce Buchanan 适用于本机应用程序的 Elastic APM 提供传出 HTTP 请求和视图加载的自动检测&#xff0c;捕获自定义事件、错误和崩溃&#xff0c;并包括用于数据分析和故障排除目的的预构建仪表板。 适用于 …

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示 1 纹理 规则和不规则的 2 纹理的用处 从纹理中恢复形状 3 分割与合成 4 分析纹理进行分类 通过识别纹理分析物理性质 如何区分纹理 5 寻找有效的纹理分类方法 发现模式、描述区域内模式 A对应图2 B对应图…

Java 基于微信小程序的电子商城购物系统

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

EL表达式和JSTL标签

1.1. EL表达式概述 EL&#xff08;Expression Language&#xff09;是一门表达式语言&#xff0c;它对应<%…%>。我们知道在JSP中&#xff0c;表达式会被输出&#xff0c;所以EL表达式也会被输出。 EL表达式的格式&#xff1a;${…}&#xff0c;例如&#xff1a;${12}…

【深度学习】S2 数学基础 P1 线性代数(上)

目录 基本数学对象标量与变量向量矩阵张量降维求和非降维求和累计求和 点积与向量积点积矩阵-向量积矩阵-矩阵乘法 深度学习的三大数学基础 —— 线性代数、微积分、概率论&#xff1b; 自本篇博文以下几遍博文&#xff0c;将对这三大数学基础进行重点提炼。 本节博文将介绍线…

mysql Day05

sql性能分析 sql执行频率 show global status like Com_______ 慢查询日志 执行时间超过10秒的sql语句 profile详情 show profiles帮助我们了解时间都耗费到哪里了 #查看每一条sql的耗时情况 show profiles#查看指定query_id的sql语句各个阶段的耗时情况 show profile fo…

单片机学习笔记---DS18B20温度传感器

目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…

基于 Python 深度学习的电影评论情感分析系统,附源码

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

前端JavaScript篇之await 在等待什么呢?async/await 如何捕获异常

目录 await 在等待什么呢&#xff1f;async/await 如何捕获异常 await 在等待什么呢&#xff1f; await 关键字实际上是等待一个表达式的结果&#xff0c;这个表达式的计算结果可以是 Promise 对象或者其他值。如果 await 后面的表达式不是 Promise 对象&#xff0c;那么 awai…