WebSocket C#服务器端 当网页刷新时出现无法重连 C#出错:数字小于数组在第一维的下限。 参数名: srcIndex

最近两天公司 要用到 WebSocket C#服务器端+Vue客户端

我之前做 WebSocket 是  C#服务器端 + 原生js客户端

原生js客户端 我用 iframe 将 WebSocket 用单独一个网页中。这个页不频繁刷新。这种做法一直没有问题

今天用 Vue客户端 来实现

Vue本身单页要 频繁刷新,当 刷新比较快时,

在网页中的websocket 的连接 始终是 Still in CONNECTING state   无论等多久都是这个状态。

这个问题 困扰了我很久。 一开始我认为是 Vue客户端 代码写的不对。其实不对。是C#服务器的问题

在这个函数中出错了

今天特意写出来,留个记念。

起初当我用 C#断点调试,则不再出错,每次刷新都能连接上。给了我启发。

在C#服务器端

注:这句  System.Threading.Thread.Sleep(100);   非常重要

如果网页不能在iframe中固定,需要刷新时(尤其是VUE这种单页不断刷新整页时)  线程等待100 毫秒 太短了,网页刷新后则不能再正确连接

解决方法: 将 100  改为 3000  在Vue上亲测没问题

#region WebSocket 监听
        private void m_WebSocketDoListen()
        {
            try
            {
                Char char1 = Convert.ToChar(65533);
                this.WebSocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                this.WebSocketListener.Bind(new IPEndPoint(this.IPV4, this.intWebSocketPort));
                this.WebSocketListener.Listen(500);//ConnectionsQueueLength
                while (true)
                {
                    Socket sc = this.WebSocketListener.Accept();
                    if (sc != null)
                    {
                        //System.Threading.Thread.Sleep(100);//这个线程 等待时间 太短了
                        System.Threading.Thread.Sleep(3000);
                        clsWebSocket socketConn = new clsWebSocket();
                        socketConn.ConnectionSocket = sc;
                        //socketConn.NewConnection += new NewConnectionEventHandler(socketConn_NewConnection);
                        socketConn.LineReceived += new clsSocket.LineReceivedEventHandler(m_OnLineReceived);//收到消息
                        socketConn.LineReceivedError += new clsSocket.LineReceivedErrorEventHandler(m_OnLineReceivedError);//收到消息时出错
                        socketConn.Disconnected += new clsSocket.DisconnectedEventHandler(m_Disconnected);//WebSocket中客户端断开连接
                        socketConn.ConnectionSocket.BeginReceive(socketConn.receivedDataBuffer,
                                                                 0, socketConn.receivedDataBuffer.Length,
                                                                 0, new AsyncCallback(socketConn.ManageHandshake),
                                                                 socketConn.ConnectionSocket.Available);;
                    }
                }
            }
            catch (Exception ex)//
            {
                myClass.clsLogHelper.m_CreateErrorLogTxt("WebScript StartServer", "出错", ex.Message.ToString());
            }
        }
        #endregion

完整代码

https://www.cnblogs.com/hailexuexi/p/16854230.html

posted @ 2022-11-03 14:20  海乐学习  阅读(253)  评论(0编辑  收藏  举报