• WebSocket(SuperSocket.WebSocket实现)服务端主动断开客户端的连接


    WebSocket(SuperSocket.WebSocket实现)服务端主动断开客户端的连接

    使用SuperSocket.WebSocket实现的WebSocket服务端,当有WebSocket客户端连接上以后,WebSocket客户端如果发消息太长或者过大时,就会出现WebSocket主动断开客户端的连接的问题,解决如下:

    using SuperSocket.SocketBase.Config;
    using SuperWebSocket;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace TESTeee
    {
        internal class Program
        {
            public static WebSocketServer ws = null;
            static void Main(string[] args)
            {
                Console.WriteLine("WebSocket服务");
                ws = new WebSocketServer();
                ws.NewSessionConnected += Ws_NewSessionConnected;
                ws.NewMessageReceived += Ws_NewMessageReceived;
                ws.SessionClosed += Ws_SessionClosed;
                //SuperSocket可以通过对ServerConfig对象进行设置,可以设置最大接收缓存大小(ReceiveBufferSize),也可以设置请求信息的最大长度(MaxRequestLength)有所限制,默认请求最大长度为1024. 该配置可以通过一个ServerConfig的对象进行设置
                var config = new ServerConfig()
                {
                    #region MyRegion
                    //public const int DefaultReceiveBufferSize = 4096;
                    //public const int DefaultListenBacklog = 100;
                    //public const int DefaultKeepAliveTime = 600;
                    //public const int DefaultSessionSnapshotInterval = 5;
                    //public const int DefaultSendBufferSize = 2048;
                    //public const int DefaultIdleSessionTimeOut = 300;
                    //public const int DefaultKeepAliveInterval = 60;
                    //public const int DefaultSendTimeout = 5000;
                    //public const int DefaultMaxRequestLength = 1024;
                    //public const int DefaultSendingQueueSize = 5;
                    //public const int DefaultMaxConnectionNumber = 100;
                    //public const int DefaultClearIdleSessionInterval = 120;
                    #endregion
                    // 限制请求的数据长度最大为1M
                    MaxRequestLength = 1024 * 1024,
                    ReceiveBufferSize = 1024 * 1024,
                    Ip = "127.0.0.1",
                    Port = 1234
                };
                //ws.Setup(config);
                //if (!ws.Setup("127.0.0.1", 1234))
                //if (!ws.Setup(config))
                //{
                //    Console.WriteLine("ChatWebSocket 设置WebSocket服务侦听地址失败");
                //    return;
                //}
                ws.Setup(config, logFactory: new SuperSocket.SocketBase.Logging.ConsoleLogFactory());
                if (!ws.Start())
                {
                    Console.WriteLine("ChatWebSocket 启动WebSocket服务侦听失败");
                    return;
                }
                Console.WriteLine("ChatWebSocket 启动服务成功");
                Console.ReadKey();
                ws.Stop();
            }
    
            public static void Ws_NewSessionConnected(WebSocketSession session)
            {
                Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}创建新会话", DateTime.Now, GetSessionName(session));
                var msg = string.Format("{0:HH:MM:ss} {1} 进入聊天室", DateTime.Now, GetSessionName(session));
    
                SendToAll(session, msg);
            }
    
            private static void Ws_NewMessageReceived(WebSocketSession session, string value)
            {
                var msg = string.Format("{0:HH:MM:ss} {1} 说: {2}", DateTime.Now, GetSessionName(session), value);
                Console.WriteLine($"{msg}");
                SendToAll(session, value);
            }
    
            public static void Ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
            {
                Console.WriteLine("{0:HH:MM:ss}  与客户端:{1}的会话被关闭 原因:{2}", DateTime.Now, GetSessionName(session), value);
                var msg = string.Format("{0:HH:MM:ss} {1} 离开聊天室", DateTime.Now, GetSessionName(session));
                SendToAll(session, msg);
            }
    
            /// <summary>
            /// 启动服务
            /// </summary>
            /// <returns></returns>
            public static void Start()
            {
                if (!ws.Setup("127.0.0.1", 1234))
                {
                    Console.WriteLine("ChatWebSocket 设置WebSocket服务侦听地址失败");
                    return;
                }
    
                if (!ws.Start())
                {
                    Console.WriteLine("ChatWebSocket 启动WebSocket服务侦听失败");
                    return;
                }
    
                Console.WriteLine("ChatWebSocket 启动服务成功");
            }
    
            /// <summary>
            /// 停止侦听服务
            /// </summary>
            public static void Stop()
            {
    
                if (ws != null)
                {
                    ws.Stop();
                }
            }
    
            public static string GetSessionName(WebSocketSession session)
            {
                return HttpUtility.UrlDecode(session.Path.TrimStart('/'));
            }
    
            public static void SendToAll(WebSocketSession session, string msg)
            {
                foreach (var sendSession in session.AppServer.GetAllSessions())
                {
                    sendSession.Send(msg);
                }
            }
        }
    }

    SuperSocket可以通过一个ServerConfig的对象进行配置设置,ServerConfig对象中默认配置如下:

     //
            // Summary:
            //     Default ReceiveBufferSize
            public const int DefaultReceiveBufferSize = 4096;
            //
            // Summary:
            //     The default listen backlog
            public const int DefaultListenBacklog = 100;
            //
            // Summary:
            //     The default keep alive time
            public const int DefaultKeepAliveTime = 600;
            //
            // Summary:
            //     The default session snapshot interval
            public const int DefaultSessionSnapshotInterval = 5;
            //
            // Summary:
            //     The default send buffer size
            public const int DefaultSendBufferSize = 2048;
            //
            // Summary:
            //     Default idle session timeout
            public const int DefaultIdleSessionTimeOut = 300;
            //
            // Summary:
            //     The default keep alive interval
            public const int DefaultKeepAliveInterval = 60;
            //
            // Summary:
            //     Default send timeout value, in milliseconds
            public const int DefaultSendTimeout = 5000;
            //
            // Summary:
            //     Default MaxRequestLength
            public const int DefaultMaxRequestLength = 1024;
            //
            // Summary:
            //     Default sending queue size
            public const int DefaultSendingQueueSize = 5;
            //
            // Summary:
            //     Default MaxConnectionNumber
            public const int DefaultMaxConnectionNumber = 100;
            //
            // Summary:
            //     Default clear idle session interval
            public const int DefaultClearIdleSessionInterval = 120;
  • 相关阅读:
    Ultra-wideband (UWB) secure wireless device pairing and associated systems
    程序员常用工具整理
    Net 使用UEditor笔记
    社交中的黄金法则,你要细细体会品味
    社交中的黄金法则,你要细细体会品味
    社交中的黄金法则,你要细细体会品味
    交际中你所不知道的说话的12个技巧!
    交际中你所不知道的说话的12个技巧!
    交际中你所不知道的说话的12个技巧!
    好好的活,简简单单过!
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/16303943.html
Copyright © 2020-2023  润新知