Xamarin ClientWebSocket... Не удается повторно подключиться после потери соединения

Я разрабатываю приложение для Android, используя ClientWebSocket.

Когда я запускаю приложение, все работает правильно, если сервер работает.

После остановки сервера клиент не может повторно подключиться к серверу и не может получать сообщения. Я заметил, что состояние clientwebsocket остается "Открытым" после остановки сервера!

Если я запускаю приложение, а затем запускаю сервер, клиент не может подключиться!

Это код:

    string ip = "192.168.1.142";
    int port = 9000;
    private const int ReceiveChunkSize = 1024;
    private const int SendChunkSize = 1024;
    private ClientWebSocket _ws;
    private readonly Uri _uri;
    private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
    private readonly CancellationToken _cancellationToken;

Подготовка клиента:

        _ws = new ClientWebSocket ();
        _ws.Options.KeepAliveInterval = TimeSpan.FromSeconds (20);
        _uri = new Uri ("ws://"+ip+":"+port);
        _cancellationToken = _cancellationTokenSource.Token;

Способ подключения:

public async void ConnectAsync()
    {
        await Task.Run (() => {
            try {
                var tk = _ws.ConnectAsync (_uri, _cancellationTokenSource.Token);
                tk.Wait(4000);
            if (tk.IsCompleted) {
                //CallOnConnected ();
                StartListen ();
                }
            } 
            catch 
            { 
            }
        });
    }

Прослушайте сообщения о доходах:

private async void StartListen()
    {
        var buffer = new byte[ReceiveChunkSize];

        try
        {
            while (_ws.State == WebSocketState.Open)
            {
                var stringResult = new StringBuilder();


                WebSocketReceiveResult result;
                do
                {
                    result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), _cancellationToken);

                    if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await
                        _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                        //CallOnDisconnected();
                    }
                    else
                    {
                        var str = Encoding.UTF8.GetString(buffer, 0, result.Count);
                        stringResult.Append(str);
                    }

                } while (!result.EndOfMessage);

                //CallOnMessage(stringResult);

            }
        }
        catch (Exception)
        {
            //CallOnDisconnected();
        }
        finally
        {
            _ws.Dispose();
        }
    }

В MainActivity я использую таймер для повторного подключения:

void Try_Connect(){
        if ((my_clientwebsocket.Connection_Status == System.Net.WebSockets.WebSocketState.Open)|(my_clientwebsocket.Connection_Status == System.Net.WebSockets.WebSocketState.Connecting)) {
            return;
        }

            new Thread (new ThreadStart (delegate { 
            RunOnUiThread (() => {
                    try {
                        my_clientwebsocket.ConnectAsync();
                    } catch {
                    }
            });
            })).Start ();


    }

Что не так?!

Спасибо за помощь

0 ответов

Другие вопросы по тегам