Laden...

ClientWebSocket: Wie auf Verbindungsabbruch reagieren?

Erstellt von DaisyChain vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.679 Views
D
DaisyChain Themenstarter:in
50 Beiträge seit 2010
vor 9 Jahren
ClientWebSocket: Wie auf Verbindungsabbruch reagieren?

Hallo!

Ich baue gerade ein Programm, welches sich mit einem WebSocketServer verbindet. Mein Code sieht in etwa so aus:


public void Connect(String host, int port) {

    // Set host
    this.host = host;

    // Set port
    this.port = port;

    if (ws == null)
        ws = new ClientWebSocket();

    // Check
    if (ws.State == WebSocketState.Open)
        return;

    Task.Run(async () => {
        
        // Connect
        try
        {
            await ws.ConnectAsync(new Uri("ws://"+host+ ":"+port), CancellationToken.None);
        }
        catch { }

        // Call on connect handler
        if (OnConnect != null && ws != null && ws.State == WebSocketState.Open)
        {
            OnConnect(this, new EventArgs());
        }

        // Buffer
        var buffer = new byte[1024];

        // Read messages
        while (ws != null && ws.State == WebSocketState.Open)
        {

            // Segment
            var segment = new ArraySegment<byte>(buffer);

            // Receive async
            var result = new WebSocketReceiveResult(0, WebSocketMessageType.Text, true);
            try
            {
                result = await ws.ReceiveAsync(segment, CancellationToken.None);
            }
            catch { }

            // Check
            if (result.MessageType == WebSocketMessageType.Close)
            {
                Disconnect();
                continue;
            }
            
            // Count
            int count = result.Count;

            // Run result
            while (!result.EndOfMessage)
            {

                if (count >= buffer.Length)
                {
                    Disconnect();
                    continue;
                }

                segment = new ArraySegment<byte>(buffer, count, buffer.Length - count);
                try
                {
                    result = await ws.ReceiveAsync(segment, CancellationToken.None);
                }
                catch { }
                count += result.Count;
            }

            // Process message
            ...
        }
    });
}

// Disconnect
public void Disconnect()
{
    // Check
    if (ws == null || ws.State != WebSocketState.Open)
        return;

    Task.Run(async () =>
    {

        // Close
        try
        {
            await ws.CloseAsync(WebSocketCloseStatus.Empty, "", CancellationToken.None);
        }
        catch { }

        // Nullify
        ws = null;

        // Call on disconnect handler
        if (OnDisconnect != null && (ws == null || ws.State != WebSocketState.Open))
        {
            OnDisconnect(this, new EventArgs());
        }

    });
}

Sowohl die Connect als auch die Disconnectmethode funktionieren super. Die Verarbeitung der Messages auch. Das Problem ist bloß:

Fahr ich den Server herunter, deaktiviere WLAN oder ziehe das Netzwerkkabel am Rechner, oder mach sonst irgendwas um die Verbindung zu unterbrechen, disconnected der Client nicht. Ich habe in meiner GUI einen Connect/Disconnect Button, also quasi ein Toggle-Button, der nach Verbindungsabbruch auf Disconnect stehen bleibt, und selbst bei wieder vorhandener Netzwerkverbindung nicht mehr will.

Das C# Framework ist 4.6, VS2015 Beta. Wie muss ich den Code abändern damit ich clientseitig auf einen Verbindungsabbruch reagieren kann!?

Vielen Dank schonmal im voraus.

1.696 Beiträge seit 2006
vor 9 Jahren

Vielleicht durch setzen von ClientWebSocketOptions.KeepAliveInterval oder du lässt einen Timer mitlaufen, der prüft, ob der Server noch da ist, wenn nicht dann die Disconnect Methode aufrufen.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::