C#网络编程--WebSocke与Socket的区别以及关系

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

在各人技术选型的时间,有没有纠结过使用WebSocket 还是选择 Socket进行通讯或者请求数据呢?我以前一开始也搞不清晰有啥,名字都有“Socket”字眼,到背面接触多了,才明白其中的区别;WebSocket 主打一个持久、实时,Socket主打一个功能灵活、颗粒度小。
以是,WebSocket 和 Socket 都是用于网络通信的技术,但它们在用途、协媾和使用方式上有所不同。下面说说它们的区别和关系:
1. 协媾和用途

WebSocket

• 协议:WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它答应客户端和服务器之间进行双向通信,而不需要像 HTTP 那样每次通信都需要建立新的连接。
• 用途:WebSocket 主要用于实时通信场景,比方谈天应用、在线游戏、实时数据推送等。它得当需要频仍、低耽误交互的应用。
特点:
• 全双工:客户端和服务器可以同时发送和接收数据。
• 持久连接:连接一旦建立,可以长时间保持,减少了握手开销。
• 轻量级:相比 HTTP,WebSocket 的消息头更小,传输服从更高。
Socket

• 协议:Socket 是一种更底层的网络通信接口,可以支持多种传输层协议,如 TCP 和 UDP。
• 用途:Socket 实用于各种网络通信需求,包括但不限于文件传输、远程登录、分布式系统等。它提供了更灵活的通信方式,但需要更多的手动管理。
特点:
• 灵活性:支持多种协议(TCP、UDP 等)和通信模式(流式、数据报)。
• 低级接口:提供了对网络连接和数据传输的细粒度控制。
• 复杂性:需要手动处置惩罚连接管理、错误处置惩罚等。
2. 使用方式

WebSocket
• 创建连接:使用 WebSocket 类或 ClientWebSocket 类(客户端)和 WebSocket 类(服务器端)。
• 发送和接收数据:通过 SendAsync 和 ReceiveAsync 方法进行数据的发送和接收。
• 关闭连接:使用 CloseAsync 方法关闭连接。
示例:WebSocket 服务器端

  1. using System;
  2. using System.Net;
  3. using System.Net.WebSockets;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. class WebSocketServer
  8. {
  9.     static async Task Main(string[] args)
  10.     {
  11.         HttpListener listener = new HttpListener();
  12.         listener.Prefixes.Add("http://localhost:8080/ws/");
  13.         listener.Start();
  14.         Console.WriteLine("WebSocket server started. Listening on http://localhost:8080/ws/");
  15.         while (true)
  16.         {
  17.             HttpListenerContext context = await listener.GetContextAsync();
  18.             if (context.Request.IsWebSocketRequest)
  19.             {
  20.                 HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
  21.                 WebSocket webSocket = webSocketContext.WebSocket;
  22.                 Console.WriteLine("Client connected.");
  23.                 _ = HandleWebSocketConnection(webSocket);
  24.             }
  25.             else
  26.             {
  27.                 context.Response.StatusCode = 400;
  28.                 context.Response.Close();
  29.             }
  30.         }
  31.     }
  32.     static async Task HandleWebSocketConnection(WebSocket webSocket)
  33.     {
  34.         try
  35.         {
  36.             byte[] buffer = new byte[1024 * 4];
  37.             while (webSocket.State == WebSocketState.Open)
  38.             {
  39.                 WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  40.                 if (result.MessageType == WebSocketMessageType.Text)
  41.                 {
  42.                     string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
  43.                     Console.WriteLine("Received: " + receivedMessage);
  44.                     string response = "Echo: " + receivedMessage;
  45.                     byte[] responseData = Encoding.UTF8.GetBytes(response);
  46.                     await webSocket.SendAsync(new ArraySegment<byte>(responseData), WebSocketMessageType.Text, true, CancellationToken.None);
  47.                 }
  48.                 else if (result.MessageType == WebSocketMessageType.Close)
  49.                 {
  50.                     await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
  51.                 }
  52.             }
  53.         }
  54.         catch (Exception ex)
  55.         {
  56.             Console.WriteLine("Error: " + ex.Message);
  57.         }
  58.         finally
  59.         {
  60.             webSocket.Dispose();
  61.         }
  62.     }
  63. }
复制代码
示例:WebSocket 客户端

  1. using System;
  2. using System.Net.WebSockets;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. class WebSocketClient
  7. {
  8.     static async Task Main(string[] args)
  9.     {
  10.         ClientWebSocket webSocket = new ClientWebSocket();
  11.         await webSocket.ConnectAsync(new Uri("ws://localhost:8080/ws/"), CancellationToken.None);
  12.         Console.WriteLine("Connected to WebSocket server.");
  13.         byte[] buffer = new byte[1024 * 4];
  14.         // 发送消息
  15.         string message = "Hello, Server!";
  16.         byte[] data = Encoding.UTF8.GetBytes(message);
  17.         await webSocket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None);
  18.         Console.WriteLine("Sent: " + message);
  19.         // 接收消息
  20.         WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  21.         string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
  22.         Console.WriteLine("Received: " + receivedMessage);
  23.         // 关闭连接
  24.         await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
  25.         webSocket.Dispose();
  26.     }
  27. }
复制代码
Socket
• 创建连接:使用 Socket 类创建套接字,并通过 Connect 方法建立连接。
• 发送和接收数据:通过 Send 和 Receive 方法进行数据的发送和接收。
• 关闭连接:使用 Close 方法关闭连接。
示例:TCP Socket 服务器端

  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. class TcpSocketServer
  7. {
  8.     static async Task Main(string[] args)
  9.     {
  10.         TcpListener listener = new TcpListener(IPAddress.Any, 13000);
  11.         listener.Start();
  12.         Console.WriteLine("Server started. Listening on port 13000...");
  13.         while (true)
  14.         {
  15.             TcpClient client = await listener.AcceptTcpClientAsync();
  16.             Console.WriteLine("Client connected.");
  17.             _ = HandleClient(client);
  18.         }
  19.     }
  20.     static async Task HandleClient(TcpClient client)
  21.     {
  22.         try
  23.         {
  24.             NetworkStream stream = client.GetStream();
  25.             byte[] buffer = new byte[256];
  26.             int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
  27.             string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  28.             Console.WriteLine("Received: " + request);
  29.             string response = "Hello, Client!";
  30.             byte[] responseData = Encoding.ASCII.GetBytes(response);
  31.             await stream.WriteAsync(responseData, 0, responseData.Length);
  32.             Console.WriteLine("Sent: " + response);
  33.             client.Close();
  34.         }
  35.         catch (Exception ex)
  36.         {
  37.             Console.WriteLine("Error: " + ex.Message);
  38.         }
  39.     }
  40. }
复制代码
示例:TCP Socket 客户端

  1. using System;
  2. using System.Net.Sockets;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. class TcpSocketClient
  6. {
  7.     static async Task Main(string[] args)
  8.     {
  9.         try
  10.         {
  11.             TcpClient client = new TcpClient();
  12.             await client.ConnectAsync("127.0.0.1", 13000);
  13.             Console.WriteLine("Connected to server.");
  14.             NetworkStream stream = client.GetStream();
  15.             string message = "Hello, Server!";
  16.             byte[] data = Encoding.ASCII.GetBytes(message);
  17.             await stream.WriteAsync(data, 0, data.Length);
  18.             Console.WriteLine("Sent: " + message);
  19.             byte[] buffer = new byte[256];
  20.             int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
  21.             string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
  22.             Console.WriteLine("Received: " + response);
  23.             client.Close();
  24.         }
  25.         catch (Exception e)
  26.         {
  27.             Console.WriteLine("Error: " + e.Message);
  28.         }
  29.     }
  30. }
复制代码
3. WebSocket与Socket 的 关系

• WebSocket 基于 Socket:WebSocket 协议实际上是在 TCP 协议之上的一个更高条理的协议。WebSocket 连接的初始握手是通过 HTTP 协议完成的,之后升级为 WebSocket 协议,使用同一个 TCP 连接进行双向通信。
• Socket 更通用:Socket 是一个更通用的网络通信接口,可以支持多种协媾和通信模式,而 WebSocket 是专门为实时、双向通信计划的一种协议。
4.总结

• WebSocket 实用于需要实时、低耽误、双向通信的场景,如谈天应用、在线游戏等。
• Socket 实用于需要更灵活、低级控制的网络通信场景,如文件传输、远程登录等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表