自学内容网 自学内容网

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)!