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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket客户端异常断开是指在WebSocket通信过程中,客户端与服务器之间的连接意外中断或出现异常情况导致通信无法继续进行的情况。以下是一些可能导致WebSocket客户端异常断开的原因: 1. 网络问题:网络中断、网络延迟过高、网络不稳定等因素可能导致WebSocket客户端与服务器之间的连接中断。 2. 服务器问题:服务器故障、服务器重启、服务器负载过高等原因可能导致WebSocket客户端无法正常连接或通信中断。 3. 客户端问题:客户端程序错误、客户端设备故障、客户端程序崩溃等原因可能导致WebSocket客户端异常断开。 4. 安全策略限制:某些安全策略可能会限制WebSocket连接,例如跨域访问限制、防火墙设置等,这可能导致WebSocket客户端无法连接或通信中断。 为了解决WebSocket客户端异常断开的问题,可以采取以下措施: 1. 检查网络连接:确保网络连接正常,排除网络问题导致的连接中断。 2. 重连机制:在客户端程序中实现重连机制,当连接中断时自动重新连接服务器。 3. 错误处理:在客户端程序中捕获并处理异常,例如记录日志、提示用户等。 4. 心跳机制:通过定时发送心跳消息来保持连接活跃,一旦连接中断可以及时发现并重新连接。 5. 优化代码和性能:确保客户端程序的代码质量和性能,减少程序错误和崩溃的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值