Wie behandeln client disconnect Socket Programmierung?
Ich geschrieben habe, eine server-side-code über Sockets, Seine Arbeit gut, aber habe ein problem, ich weiß nicht, wie um dieses Szenario zu behandeln: wenn der Kunde nur schließt die Anwendung, ohne das senden von Disconnect-request, meine server-Seite das Programm stürzt ab. Was muss ich tun, um dies zu vermeiden? Bitte führe mich ich bin neu in Socket-Programmierung.
private void OnReceive(IAsyncResult result)
{
try
{
Socket clientSocket = (Socket)result.AsyncState;
clientSocket.EndReceive(result);
command = responseMessage = string.Empty;
command = ByteToString(receviedData);
receviedData = new byte[30];
if (command=="Connect")
{
ClientInfo clientInfo = new ClientInfo();
clientInfo.socket = clientSocket;
clientInfo.IP = clientSocket.RemoteEndPoint.ToString();
connectedClients.Add(clientInfo);
responseMessage = "Connection established...";
}
else if (command=="Disconnect")
{
for (int i = 0; i < connectedClients.Count; i++)
{
if (connectedClients[i].socket == clientSocket)
{
connectedClients.RemoveAt(i);
break;
}
}
clientSocket.Close();
}
else
{
responseMessage = "Error";
}
byte[] responseStatus = StringToByte(responseMessage);
for (int i = 0; i < connectedClients.Count; i++)
{
if (connectedClients[i].socket==clientSocket)
{
connectedClients[i].socket.BeginSend(responseStatus, 0, responseStatus.Length,SocketFlags.None, new AsyncCallback(OnSend), connectedClients[i].socket);
break;
}
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
- müssen Sie try/catch-die entsprechende exception: msdn.microsoft.com/en-US/library/0yd65esw(v=vs. 110).aspx, Wie Sie scheinen neu für stack-überlauf, bitte Lesen Sie den FAQ-Bereich. stackoverflow.com/faq
- poste bitte den code, wo du die Ausnahme.
- Ich bin mit diesem, aber der ganze serverseitige Anwendung zum Absturz zu bringen, weil dieser und nicht reagiert, um andere Kunden auch
- ich habe den code @ErenErsönmez
- Nun sind Sie gerade wieder werfen die Ausnahme. Müssen Sie ignorieren es einfach (aber vielleicht tun andere Dinge, wie das entfernen der client-Objekt aus connectedClients).
- Ich begann eine Antwort und werden versuchen, Ihnen zu helfen. Können Sie bitte die Art/Erklärung
connectedClients
? Ist esList<ClientInfo>
? - struct ClientInfo { public Socket socket;//Socket der client public string IP; }
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Anwendung abstürzt, weil Sie eine Ausnahme in der
catch
block der Methode.Wenn Sie nicht möchten, dass Ihre Anwendung zum Absturz zu löschen, müssen Sie die
throw new Exception(ex.Message);
Linie von dercatch
block.Ersetzen Sie es mit dem code die Fehlerbehandlung und anmutig stellt Sie Ihre Anwendung in einen sicheren Zustand. Lesen Sie Ihren code, sollte dies durch entfernen der
clientSocket
ausconnectedClients
Zweitens, es ist besser, benutzen Sie einfach
throw;
stattthrow new Exception(ex.Message);
.throw;
wird wieder die ursprüngliche Ausnahme-Objekt und damit die Erhaltung der stack-trace und andere wichtige Informationen, hilft beim Debuggen von software.Mit
new Exception("Message")
wird ein völlig neues exception-Objekt mit der aktuellen stack-trace.catch
block). Er zusätzlich darauf hingewiesen, dass Sie überprüfen müssen, um die Rückkehr Wert vonEndReceive
machte ich einige änderungen am code, um die Lesbarkeit zu verbessern. tl;dr: alle von ihm. Über "skalierbare Anwendungen": das ist nicht dein problem im moment. Ihr problem ist, make it work. Sorge über die Leistung, sobald Ihr code funktioniert, ist korrekt und lesbar ist. KaumWerden Sie werfen eine neue Ausnahme innerhalb der
catch
block, das macht nicht viel Sinn, es sei denn, Sie machen einige logging oder ähnliches. Ändern Sie den catch-block, wie:Außerdem sollten Sie überprüfen, dass die Anzahl der gelesenen bytes zurückgegeben, die von
EndReceive
. Wenn Sie erhalten von null-bytes, das heißt, der client hat beim Herunterfahren die Verbindung: