![]() |
ServerSocket fehler?? Wenn es ein Fehler ist
Hallo, ich bin Anfänger und versuche mich gerade dadran einen Netzwerkchat zu programmieren. Also folgende Sache:
Wenn der Client auf Connect klickt, soll der Server folgende 2 Zeilen schicken. Einmal: [-Nachricht-] Servernachricht: User '+Benutzer+' hat sich eingeloggt. und einmal [-User_Add-] '+Benutzer+'' Also habe ich das so programmiert:
Delphi-Quellcode:
und einmal
Nachricht_out := '[-Nachricht-] Servernachricht: User '+Benutzer+' hat sich eingeloggt.';
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin ServerSocket1.Socket.Connections[i].SendText(Nachricht_out); end;
Delphi-Quellcode:
Habe gedacht das er es einzelnt sendet, doch was passiert, beim Client kommt es zusammen an also so:
Nachricht_out := '[-User_Add-] '+Benutzer+'';
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin ServerSocket1.Socket.Connections[i].SendText(Nachricht_out); end; [-Nachricht-] Servernachricht: User Benutzer hat sich eingeloggt.[-User_Add-] Benutzer ich brauch es aber, damit der Client die kommandos in der [--] versteht, das er die sachen einzelnt sendet. also muss ich ja denke ich mal zwischen den for's noch irgendwie den Buffer wieder frei geben und senden bevor das 2. For kommt oder wie? Danke für die Hilfe Andre |
Re: ServerSocket fehler?? Wenn es ein Fehler ist
Zitat:
Der Client muss alle Datenpakete hintereinander setzen und daraus seine Befehle entnehmen. Bleibt ein "halber" Befehl im Puffer, muss der Client diesen bis zum Empfang des nächsten Datenpakets zwischenspeichern. Viele Internetprotokolle (FTP, SMTP, POP3, ...) verwenden einen Zeilenumbruch (LF) als Trenner zwischen den einzelnen Befehlen. Das würde ich dir auch empfehlen. Hier etwas Pseudocode:
Delphi-Quellcode:
var
daten:string; procedure TForm1.OnReceive(); var p : integer; befehl : string; begin // Daten anhängen daten := daten + socket.ReceiveString; // Nach Befehlen suchen repeat p := Pos(daten, #10); // Suche nach Befehlstrenner if p <> -1 then begin befehl := Copy(daten, 1, p); // einzelnen Befehl rausziehen Delete(daten, 1, p+1); // Befehl aus Puffer löschen ExecuteBefehl(befehl); // Befehl ausführen end; until p=-1; end; |
Re: ServerSocket fehler?? Wenn es ein Fehler ist
Nichts für ungut... aber laut meiner bescheidenen Meinung nach sind fehler in deinem Code, habe nun den genommen:
Delphi-Quellcode:
daten := Socket.ReceiveText;
repeat p := Pos('#10',daten); // Suche nach Befehlstrenner if p <> 0 then begin Status_Nachricht := Copy(daten, 1, p-1); // einzelnen Befehl rausziehen Delete(daten, 1, p+2); // Befehl aus Puffer löschen showmessage(Status_Nachricht); // Befehl ausführen end; until p=0; |
Re: ServerSocket fehler?? Wenn es ein Fehler ist
Zitat:
Ändere die erste Zeile so ab:
Delphi-Quellcode:
daten := daten + Socket.ReceiveText;
|
Re: ServerSocket fehler?? Wenn es ein Fehler ist
naja es klappt ja jetzt, allerdings mißbrauche ich den Thead mal direkt weiter.
Und zwar, wenn ich den Client schließe, dann soll er ja die Connection zum Server abbauen. Also hab ich es so gemacht:
Delphi-Quellcode:
und was passiert dann beim Server, es kommt eine Fehlermeldung:
procedure TForm1.FormDestroy(Sender: TObject);
begin if (ClientSocket1.Active) then // noch online? ClientSocket1.Close; // ja, dann trennen end; Asynchroner Socket-Fehler 10053 warum kommt dieser bekloppte Fehler?? Ich hab kein Plan warum!! Kommt sobald der Client ClientSocket1.Close; macht. Bitte helft mir :D MFG Andre |
Re: ServerSocket fehler?? Wenn es ein Fehler ist
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz