C# WebSocket实现简易聊天室

背景

之前出了一期Tcp通讯教程,那个是关于PC端跟PC端通信的,这一期是PC端跟浏览器通信的,底层上来说其实基于Tcp通讯协议。

开始

1.建立控制台应用程序,框架选择4.7.2

2.进入Nuget安装Fleck库

C# WebSocket实现简易聊天室_第1张图片

3.修改Program.cs代码

using System;
using System.Collections.Concurrent;
using Fleck;

namespace CSharp_WebSocket_Demo
{
    class Program
    {

        static void Main(string[] args)
        {
            //服务器地址
            string ip = "127.0.0.1";
            //服务端口
            int port = 80;

            //多线程安全的字典,存储客户端
            //键:客户端ip:port
            //值:客户端对象
            ConcurrentDictionary webSocketConnectionDictionary = new ConcurrentDictionary();

            //服务端
            WebSocketServer webSocketServer = new WebSocketServer($"ws://{ip}:{port}");

            //出错后自动重启
            webSocketServer.RestartAfterListenError = true;

            //开启服务
            webSocketServer.Start(socket =>
            {
                string key = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;

                //客户端连接上事件
                socket.OnOpen = () =>
                {
                    Console.WriteLine($"客户端【{key}】连接上服务器");
                    //尝试添加到字典中
                    webSocketConnectionDictionary.TryAdd(key, socket);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务关闭事件
                socket.OnClose = () =>
                {
                    Console.WriteLine($"客户端【{key}】断开连接");
                    //尝试从字典中移除
                    webSocketConnectionDictionary.TryRemove(key, out _);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务器出错事件
                socket.OnError = (Exception e) =>
                {
                    Console.WriteLine($"客户端【{key}】连接出错");
                    //尝试从字典中移除
                    webSocketConnectionDictionary.TryRemove(key, out _);
                    Console.WriteLine($"当前客户端连接数:{webSocketConnectionDictionary.Count}");
                };

                //服务器接到客户端消息事件
                socket.OnMessage = (string msg) =>
                {
                    Console.WriteLine($"客户端【{key}】发来消息:{msg}");

                    //给所有客户端返回该消息,实现聊天功能
                    foreach (IWebSocketConnection webSocketConnection in webSocketConnectionDictionary.Values)
                    {
                        try
                        {
                            webSocketConnection.Send($"【{key}】:msg");
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine($"尝试给{webSocketConnection.ConnectionInfo.ClientIpAddress}:{webSocketConnection.ConnectionInfo.ClientPort}发送消息发生异常");
                            Console.WriteLine(e.StackTrace);
                        }
                    }
                };
            });

            Console.WriteLine($"服务端开启 ws://{ip}:{port}");

            //防止程序一闪而过
            Console.ReadKey();
        }
    }
}

4.运行程序

C# WebSocket实现简易聊天室_第2张图片

5.客户端代码用HbuilderX运行



	
	
		

WebSocket Test

 C# WebSocket实现简易聊天室_第3张图片

 6.发送消息试一试

C# WebSocket实现简易聊天室_第4张图片

测试成功

源码

码云连接【CSharp WebSocket Demo: 使用C#建立WebSocket服务器,调用了大佬的Fleck库,实现了一个简单的聊天室】 

你可能感兴趣的:(websocket,网络协议,网络)