在各人技术选型的时间,有没有纠结过使用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 服务器端
- using System;
- using System.Net;
- using System.Net.WebSockets;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- class WebSocketServer
- {
- static async Task Main(string[] args)
- {
- HttpListener listener = new HttpListener();
- listener.Prefixes.Add("http://localhost:8080/ws/");
- listener.Start();
- Console.WriteLine("WebSocket server started. Listening on http://localhost:8080/ws/");
- while (true)
- {
- HttpListenerContext context = await listener.GetContextAsync();
- if (context.Request.IsWebSocketRequest)
- {
- HttpListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
- WebSocket webSocket = webSocketContext.WebSocket;
- Console.WriteLine("Client connected.");
- _ = HandleWebSocketConnection(webSocket);
- }
- else
- {
- context.Response.StatusCode = 400;
- context.Response.Close();
- }
- }
- }
- static async Task HandleWebSocketConnection(WebSocket webSocket)
- {
- try
- {
- byte[] buffer = new byte[1024 * 4];
- 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: " + receivedMessage);
- string response = "Echo: " + receivedMessage;
- byte[] responseData = Encoding.UTF8.GetBytes(response);
- await webSocket.SendAsync(new ArraySegment<byte>(responseData), WebSocketMessageType.Text, true, CancellationToken.None);
- }
- else if (result.MessageType == WebSocketMessageType.Close)
- {
- await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
- }
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine("Error: " + ex.Message);
- }
- finally
- {
- webSocket.Dispose();
- }
- }
- }
复制代码 示例:WebSocket 客户端
- using System;
- using System.Net.WebSockets;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- class WebSocketClient
- {
- static async Task Main(string[] args)
- {
- ClientWebSocket webSocket = new ClientWebSocket();
- await webSocket.ConnectAsync(new Uri("ws://localhost:8080/ws/"), CancellationToken.None);
- Console.WriteLine("Connected to WebSocket server.");
- byte[] buffer = new byte[1024 * 4];
- // 发送消息
- string message = "Hello, Server!";
- byte[] data = Encoding.UTF8.GetBytes(message);
- await webSocket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None);
- Console.WriteLine("Sent: " + message);
- // 接收消息
- WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
- string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
- Console.WriteLine("Received: " + receivedMessage);
- // 关闭连接
- await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
- webSocket.Dispose();
- }
- }
复制代码 Socket
• 创建连接:使用 Socket 类创建套接字,并通过 Connect 方法建立连接。
• 发送和接收数据:通过 Send 和 Receive 方法进行数据的发送和接收。
• 关闭连接:使用 Close 方法关闭连接。
示例:TCP Socket 服务器端
- using System;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading.Tasks;
- class TcpSocketServer
- {
- static async Task Main(string[] args)
- {
- TcpListener listener = new TcpListener(IPAddress.Any, 13000);
- listener.Start();
- Console.WriteLine("Server started. Listening on port 13000...");
- while (true)
- {
- TcpClient client = await listener.AcceptTcpClientAsync();
- Console.WriteLine("Client connected.");
- _ = HandleClient(client);
- }
- }
- static async Task HandleClient(TcpClient client)
- {
- try
- {
- NetworkStream stream = client.GetStream();
- byte[] buffer = new byte[256];
- int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
- string request = Encoding.ASCII.GetString(buffer, 0, bytesRead);
- Console.WriteLine("Received: " + request);
- string response = "Hello, Client!";
- byte[] responseData = Encoding.ASCII.GetBytes(response);
- await stream.WriteAsync(responseData, 0, responseData.Length);
- Console.WriteLine("Sent: " + response);
- client.Close();
- }
- catch (Exception ex)
- {
- Console.WriteLine("Error: " + ex.Message);
- }
- }
- }
复制代码 示例:TCP Socket 客户端
- using System;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading.Tasks;
- class TcpSocketClient
- {
- static async Task Main(string[] args)
- {
- try
- {
- TcpClient client = new TcpClient();
- await client.ConnectAsync("127.0.0.1", 13000);
- Console.WriteLine("Connected to server.");
- NetworkStream stream = client.GetStream();
- string message = "Hello, Server!";
- byte[] data = Encoding.ASCII.GetBytes(message);
- await stream.WriteAsync(data, 0, data.Length);
- Console.WriteLine("Sent: " + message);
- byte[] buffer = new byte[256];
- int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
- string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
- Console.WriteLine("Received: " + response);
- client.Close();
- }
- catch (Exception e)
- {
- Console.WriteLine("Error: " + e.Message);
- }
- }
- }
复制代码 3. WebSocket与Socket 的 关系
• WebSocket 基于 Socket:WebSocket 协议实际上是在 TCP 协议之上的一个更高条理的协议。WebSocket 连接的初始握手是通过 HTTP 协议完成的,之后升级为 WebSocket 协议,使用同一个 TCP 连接进行双向通信。
• Socket 更通用:Socket 是一个更通用的网络通信接口,可以支持多种协媾和通信模式,而 WebSocket 是专门为实时、双向通信计划的一种协议。
4.总结
• WebSocket 实用于需要实时、低耽误、双向通信的场景,如谈天应用、在线游戏等。
• Socket 实用于需要更灵活、低级控制的网络通信场景,如文件传输、远程登录等。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |