コード例 #1
0
        public async Task TestServer_Client_External_NetworkCableDisconnect()
        {
            //arrange
            var       server = new WebListenerWebSocketServer();
            var       port   = 8883;//_FreeTcpPort();
            Stopwatch sw     = null;

            bool disconnected = false;
            Guid connid       = Guid.Empty;
            TaskCompletionSource <bool> connectionEstablished = new TaskCompletionSource <bool>();
            TaskCompletionSource <bool> disconnectedTCS       = new TaskCompletionSource <bool>();

            var beh = new testBeh()
            {
                ClosedHandler = (e) =>
                {
                    if (connid == e.ConnectionId)
                    {
                        disconnectedTCS.TrySetResult(true);
                        disconnected = true;
                    }
                },
                ConnectionEstablished = (cid, ctx) =>
                {
                    Console.WriteLine("Connected");
                    connid = cid;
                    connectionEstablished.TrySetResult(true);
                }
            };

            beh.StringMessageHandler = (e) => { e.WebSocket.SendStringAsync(e.Data + e.Data, CancellationToken.None); };
            var u = $"://+:{port}/";

            server.AddRouteBehavior("/aaa", () => beh);
            await server.StartAsync("http" + u);

            await connectionEstablished.Task;
            await Task.Delay(1000);//wait a sec send data

            var times = 0;

            while (times < 1000 || !disconnected)
            {
                try
                {
                    await server.SendBytesAsync(connid, Encoding.UTF8.GetBytes($"ServerTime: {DateTime.Now.ToLongTimeString()}"));
                }
                catch
                {
                    break;
                }
                await Task.Delay(100);

                times++;
            }
            sw = Stopwatch.StartNew();


            await Task.WhenAny(Task.Delay(TimeSpan.FromMinutes(6)), disconnectedTCS.Task);

            var time = sw.Elapsed;

            Assert.True(disconnected);
            server.Dispose();
        }