C#实现WebSocket通讯详细代码

第一步:在vs的NuGet里导入Fleck包,选择自己想要安装的项目安装

第二步

创建SocketService通讯控制类

namespace MeasureRobot.Service.Utils.FleckService
{
    /// <summary>
    /// C# 实现WebSocket控制核心类
    /// </summary>
    public class SocketService
    {
        public void Start()
        {
            FleckLog.Level = LogLevel.Debug;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://192.168.0.107:8088");
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    Debug.WriteLine(DateTime.Now + "  hello2,Open");
                    Console.WriteLine("Open!");
                    allSockets.Add(socket);
                };
                socket.OnClose = () =>
                {
                    Debug.WriteLine(DateTime.Now + "  hello2,Close");
                    Console.WriteLine("Close!");
                    allSockets.Remove(socket);
                };
                socket.OnMessage = message =>
                {
                    Debug.WriteLine(DateTime.Now + "  hello2,Close,Echo");
                    Console.WriteLine(message);
                    allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                };
            });

            var input = Console.ReadLine();

            while (input != "exit")
            {
                foreach (var socket in allSockets.ToList())
                {
                    socket.Send(input);
                }
                input = Console.ReadLine();
            }
        }
    }
}

由于最后有个无限循环,所以不能使用接口去开启,这样接口没有返回数据

 

第三步

检测webSocket是否开启成功

在浏览器的控制台中输入

ws = new WebSocket("ws://192.168.0.107:8088");

ws.onopen = function() { 
    ws.send('websocekt测试'); 
};

这样就是成功了 

bug记录:

第一个bug:

首先出现:在其上下文中,该请求的地址无效。

这样的错误提醒,是因为

在var server = new WebSocketServer("ws://192.168.1.107:54945");

这行代码中,192.168.1.107:54945要改成自己电脑的ip

这样就解决问题了

第二个bug:

错误信息:以一种访问权限不允许的方式做了一个访问套接字的尝试。

这个是因为端口不能用被占用的端口

也不能使用项目运行的端口,

否则就会在出现这个错误

三 注意事项

 1,如果时webapi项目

  只需要在Global.asax.cs项目启动文件中调用,就会在项目启动时运行webSocket

2其他情况,

在使用前调用一下start方法,开启webSocket即可

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里是一个完整的 C# WebSocket 创建聊天室的示例代码,包括创建 WebSocket 服务器对象、实现 Echo 类、实现 ChatRoomManager 类等。 ``` using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WebSocketSharp; using WebSocketSharp.Server; namespace WebSocketChatRoom { class ChatRoom { private string _roomId; private List<WebSocket> _clients; public ChatRoom(string roomId) { _roomId = roomId; _clients = new List<WebSocket>(); } public void AddClient(WebSocket client) { _clients.Add(client); } public void RemoveClient(WebSocket client) { _clients.Remove(client); } public void Broadcast(string message) { foreach (var client in _clients) { client.Send(message); } } } class ChatRoomManager { private static List<ChatRoom> _activeRooms = new List<ChatRoom>(); public static void CreateNewRoom() { // Generate a unique ID for the new chat room string roomId = Guid.NewGuid().ToString(); // Create a new chat room object var room = new ChatRoom(roomId); // Add the chat room to the list of active chat rooms _activeRooms.Add(room); } public static string GetAvailableRoomId() { // Find the first available chat room ID for (int i = 0; i < 100; i++) { string roomId = i.ToString("D2"); if (!_activeRooms.Any(r => r.RoomId == roomId)) { return roomId; } } throw new ApplicationException("No available chat room ID found."); } public static void JoinRoom(string roomId, WebSocket client) { // Find the chat room with the specified ID var room = _activeRooms.FirstOrDefault(r => r.RoomId == roomId); if (room == null) { throw new ApplicationException($"Chat room with ID {roomId} not found."); } // Add the client to the chat room room.AddClient(client); // Send a welcome message to the client client.Send($"Welcome to chat room {roomId}!"); } public static void LeaveRoom(string roomId, WebSocket client) { // Find the chat room with the specified ID var room = _activeRooms.FirstOrDefault(r => r.RoomId == roomId); if (room == null) { throw new ApplicationException($"Chat room with ID {roomId} not found."); } // Remove the client from the chat room room.RemoveClient(client); } public static void Broadcast(string roomId, string message) { // Find the chat room with the specified ID var room = _activeRooms.FirstOrDefault(r => r.RoomId == roomId); if (room == null) { throw new ApplicationException($"Chat room with ID {roomId} not found."); } // Broadcast the message to all clients in the chat room room.Broadcast(message); } } class ChatRoomBehavior : WebSocketBehavior { private string _roomId; protected override void OnOpen() { // Get the ID of the new chat room string roomId = ChatRoomManager.GetAvailableRoomId(); // Join the chat room ChatRoomManager.JoinRoom(roomId, this); // Save the chat room ID to the behavior object _roomId = roomId; } protected override void OnMessage(MessageEventArgs e) { // Broadcast the message to all clients in the chat room ChatRoomManager.Broadcast(_roomId, e.Data); } protected override void OnClose(CloseEventArgs e) { // Leave the chat room ChatRoomManager.LeaveRoom(_roomId, this); } } class Program { static void Main(string[] args) { // Create a WebSocket server on port 8080 var wssv = new WebSocketServer(8080); // Add the ChatRoom behavior to the server wssv.AddWebSocketService<ChatRoomBehavior>("/ChatRoom"); // Start the server wssv.Start(); // Create a new chat room ChatRoomManager.CreateNewRoom(); // Wait for input to stop the server Console.WriteLine("Press any key to stop the server..."); Console.ReadLine(); // Stop the server wssv.Stop(); } } } ``` 在这个示例代码,我们创建了一个 ChatRoom 类,用于表示聊天室对象;创建了一个 ChatRoomManager 类,用于管理聊天室;创建了一个 ChatRoomBehavior 类,用于处理客户端的 WebSocket 请求。在 Main 方法,我们创建了一个 WebSocket 服务器对象,并将 ChatRoomBehavior 添加到服务器。然后,我们创建了一个新的聊天室,并等待用户输入以停止服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值