C#网络编程--WebSocke与Socket的区别以及关系
在大家技术选型的时候,有没有纠结过使用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 适用于需要更灵活、低级控制的网络通信场景
,如文件传输、远程登录等。
原文地址:https://blog.csdn.net/m0_74825074/article/details/144679769
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!