C#怎么使用WebSockets C# WebSocket服务端与客户端实现

来源:AI编程作者:清原小日向头衔:网络博主
导读:本期聚焦于小伙伴创作的《C#怎么使用WebSockets C# WebSocket服务端与客户端实现》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么使用WebSockets C# WebSocket服务端与客户端实现》有用,将其分享出去将是对创作者最好的鼓励。

在C#中可以通过System.Net.WebSockets命名空间提供的类来实现WebSocket通信,该命名空间包含了服务端和客户端所需的全部核心类型,无需依赖第三方库即可完成基础功能开发。

C#怎么使用WebSockets C# WebSocket服务端与客户端实现

WebSocket服务端实现

服务端基于HttpListener监听请求,当接收到WebSocket请求时升级连接,之后就可以进行双向消息传输。以下是完整的服务端实现代码:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketServerDemo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 创建HttpListener监听本地8080端口
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:8080/");
            listener.Start();
            Console.WriteLine("WebSocket服务端已启动,监听地址:http://localhost:8080/");

            while (true)
            {
                // 等待客户端连接请求
                HttpListenerContext context = await listener.GetContextAsync();
                // 判断是否为WebSocket请求
                if (context.Request.IsWebSocketRequest)
                {
                    // 处理WebSocket连接
                    Task.Run(() => ProcessWebSocketAsync(context));
                }
                else
                {
                    context.Response.StatusCode = 400;
                    context.Response.Close();
                }
            }
        }

        static async Task ProcessWebSocketAsync(HttpListenerContext context)
        {
            WebSocketContext webSocketContext = null;
            try
            {
                // 接受WebSocket连接
                webSocketContext = await context.AcceptWebSocketAsync(null);
                WebSocket webSocket = webSocketContext.WebSocket;
                Console.WriteLine("客户端已连接");

                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.Close)
                    {
                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "连接关闭", CancellationToken.None);
                        Console.WriteLine("客户端已断开连接");
                        break;
                    }

                    // 处理接收到的文本消息
                    string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count);
                    Console.WriteLine($"收到客户端消息:{receivedMessage}");

                    // 向客户端发送响应消息
                    string responseMessage = $"服务端已收到消息:{receivedMessage}";
                    byte[] responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
                    await webSocket.SendAsync(new ArraySegment<byte>(responseBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"服务端处理异常:{ex.Message}");
            }
            finally
            {
                webSocketContext?.WebSocket?.Dispose();
            }
        }
    }
}

WebSocket客户端实现

客户端使用ClientWebSocket类发起连接,连接建立后可以主动发送消息并接收服务端的响应。以下是客户端实现代码:

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketClientDemo
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using (ClientWebSocket client = new ClientWebSocket())
            {
                // 连接服务端地址
                Uri serverUri = new Uri("ws://localhost:8080/");
                await client.ConnectAsync(serverUri, CancellationToken.None);
                Console.WriteLine("已连接到WebSocket服务端");

                // 启动接收消息的任务
                Task receiveTask = Task.Run(() => ReceiveMessageAsync(client));

                // 循环发送消息
                while (client.State == WebSocketState.Open)
                {
                    Console.Write("请输入要发送的消息(输入exit退出):");
                    string input = Console.ReadLine();
                    if (input == "exit")
                    {
                        await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭", CancellationToken.None);
                        break;
                    }

                    byte[] sendBuffer = Encoding.UTF8.GetBytes(input);
                    await client.SendAsync(new ArraySegment<byte>(sendBuffer), WebSocketMessageType.Text, true, CancellationToken.None);
                }

                await receiveTask;
            }
        }

        static async Task ReceiveMessageAsync(ClientWebSocket client)
        {
            byte[] buffer = new byte[1024];
            try
            {
                while (client.State == WebSocketState.Open)
                {
                    WebSocketReceiveResult result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                    if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "连接关闭", CancellationToken.None);
                        Console.WriteLine("服务端已关闭连接");
                        break;
                    }

                    string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                    Console.WriteLine($"收到服务端响应:{message}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"接收消息异常:{ex.Message}");
            }
        }
    }
}

核心注意事项

  • 服务端需要以管理员权限运行,否则可能无法绑定指定端口
  • WebSocket连接地址前缀,服务端是http,客户端连接时使用ws,如果是HTTPS则对应wss
  • 收发消息时需要正确处理ArraySegment<byte>的偏移和长度,避免读取到无效数据
  • 实际应用中需要添加更完善的异常处理和重连机制,避免网络波动导致连接中断

功能扩展建议

上述代码是基础实现,实际开发中可以根据需求扩展功能,比如添加消息类型区分、二进制数据传输、多客户端连接管理、心跳检测机制等。如果需要更丰富的功能,也可以考虑使用第三方库如WebSocketSharp,但原生实现已经能满足大部分基础实时通信场景的需求。

C#WebSocket服务端客户端WebSockets修改时间:2026-07-14 11:30:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。