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.
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.
**:::