|
RedShakal
(Gast)
n/a Beiträge |
#1
Hallo, ich wollte gerade meinem Konsolen TCP Server noch einen SocketChat hinzufügen. Der Server wird initialisiert, jedoch werden die Ereignisse nicht aufgerufen. Ich wollte euch Fragen ob ihr mal über meinen Source schauen könnt wo der Fehler liegen könnte. Der TCP Server funktioniert im übrigen.
Delphi-Quellcode:
Ich vermute der Fehler liegt darin, das ich 2 Server nacheinander erstelle und irgentwie die Ereignisse durch das While True do Sleep(50); nicht aufrufe. Der TCP Server funktioniert Standalone im übrigen Prima.
program Project1;
{$APPTYPE CONSOLE} uses SysUtils, IdTCPServer, IdContext, IdBaseComponent, IdComponent, IniFiles, Classes, ScktComp; type TServer = class(TObject) IdTCPServer1: TIdTCPServer; procedure IdTCPServer1Execute(AThread: TIdContext); procedure IdTCPServer1Connect(AThread: TIdContext); private { Private declarations } constructor Create; public { Public declarations } end; TChatServer = class(TObject) Chat: TServerSocket; Port: Word; constructor Create; procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); end; Const Serverver = '0.03'; type TDynStringArray = Array of string; var sl : TStringList; Zeile : string; Clientver : string; i : Integer; function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray; var SepLen: Integer; F, P: PChar; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then P := StrEnd(F); SetLength(Result, Length(Result) + 1); SetString(Result[High(Result)], F, P - F); F := P; if P = Separator then SetLength(Result, Length(Result) + 1); while (P^ <> #0) and (P - F < SepLen) do Inc(P); end; end; // ---------------------------- Chatserver ---------------------------- \\ procedure TChatServer.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin writeln(Socket.RemoteAddress+' hat sich im Chatserver eingeloggt.'); end; procedure TChatServer.OnClientRead(Sender: TObject; Socket: TCustomWinSocket); var MSG : String; begin MSG := Socket.RemoteAddress+' : '+Socket.ReceiveText; writeln(MSG); for i := 0 to Chat.Socket.ActiveConnections-1 do Chat.Socket.Connections[i].SendText(MSG); end; procedure TChatServer.OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin writeln(Socket.RemoteAddress+' hat sich vom Chatserver ausgeloggt.'); end; // ---------------------------- Loginserver ---------------------------- \\ procedure TServer.IdTCPServer1Execute(AThread: TIdContext); var Data : String; StrArr : TDynStringArray; ini : TIniFile; f : TextFile; Files : string; y,m,d : Word; Admin : Integer; begin with AThread.Connection do begin DecodeDate(Now,d,m,y); Files := Format('log\%.2d-%.2d-%.2d.txt',[y,m,d]); //AssignFile(f, Files); //if FileExists(Files) then Append(f) else Rewrite(f); Data := String(Socket.ReadLn); Data := Trim(Data); if Length(Data) > 0 then begin StrArr := Explode('|', Data); if StrArr[0] = 'login' then begin AssignFile(f,'version.txt'); Reset(f); If IoResult=0 then begin ReadLn(f, Clientver); CloseFile(f); end; if StrArr[3] = Clientver then begin if FileExists('accounts\'+StrArr[1]+'.ini') then begin ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini'); try if StrArr[2] = ini.ReadString('Login','Passwort','') then begin Admin := ini.ReadInteger('Admin','Level',0); if Admin = 0 then begin Socket.WriteLn('login'); WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.'); end; if Admin = 1 then begin Socket.WriteLn('login|admin'); WriteLn('['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat sich eingeloggt.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat sich eingeloggt.'); end; end else begin Socket.WriteLn('invalid'); WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.'); end; finally ini.free; end; end else begin Socket.WriteLn('na'); WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.'); end; end else begin Socket.WriteLn('version'); end; end; if StrArr[0] = 'register' then begin if FileExists('accounts\'+StrArr[1]+'.ini') then begin Socket.WriteLn('vorhanden'); WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.'); end else begin try ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini'); ini.WriteString('Login','Passwort',StrArr[2]); ini.WriteString('Login','E-Mail',StrArr[3]); ini.WriteString('Data','Geschlecht',StrArr[4]); ini.WriteString('Data','Geburtstag',StrArr[5]); ini.WriteString('Data','ICQ',StrArr[6]); ini.WriteString('Data','Name',StrArr[7]); ini.WriteInteger('Stats','gespielt',0); ini.WriteInteger('Stats','gewonnen',0); ini.WriteInteger('Stats','verloren',0); ini.WriteString('Stats','Spielzeit','00:00:00'); ini.WriteInteger('Admin','Level',0); ini.WriteInteger('Admin','PermBan',0); ini.WriteString('Admin','TempBan','1.1.2009'); ini.WriteString('Admin','Grund',''); ini.WriteString('Info','MAC',''); finally Socket.WriteLn('erfolg'); ini.free; WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.'); end; end; end; if StrArr[0] = 'changepw' then begin if FileExists('accounts\'+StrArr[1]+'.ini') then begin ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini'); if StrArr[2] = ini.ReadString('Login','Passwort','') then begin ini.WriteString('Login','Passwort',StrArr[3]); Socket.WriteLn('pwchange'); WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sein Passwort geaendert.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sein Passwort geaendert.'); end else Socket.WriteLn('pwfalsch'); end; end; if StrArr[0] = 'AdminInfo' then begin if FileExists('accounts\'+StrArr[1]+'.ini') then begin ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini'); try Admin := ini.ReadInteger('Admin','Level',0); if (StrArr[2] = ini.ReadString('Login','Passwort','')) and (Admin = 1) then begin if FileExists('accounts\'+StrArr[3]+'.ini') then begin ini.Free; ini := TIniFile.Create('accounts\'+StrArr[3]+'.ini'); Socket.WriteLn('AdminInfo'+'|'+ini.ReadString('Login','E-Mail','')+'|'+ini.ReadString('Data','Geschlecht','')+'|'+ini.ReadString('Data','Geburtstag','')+'|'+ini.ReadString('Data','ICQ','')+'|'+ini.ReadString('Data','Name','')+'|'+InttoStr(ini.ReadInteger('Stats','gespielt',0))+'|'+InttoStr(ini.ReadInteger('Stats','gewonnen',0))+'|'+InttoStr(ini.ReadInteger('Stats','verloren',0))+'|'+ini.ReadString('Stats','Spielzeit','')+'|'+InttoStr(ini.ReadInteger('Admin','Level',0))+'|'+InttoStr(ini.ReadInteger('Admin','PermBan',0))+'|'+ini.ReadString('Admin','TempBan','')+'|'+ini.ReadString('Admin','Grund','')); WriteLn('['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat Informationen über '+StrArr[3]+' angefordert.'); //WriteLn(f, '['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat Informationen über '+StrArr[3]+' angefordert.'); end; end else Socket.WriteLn('AdminInfoNA'); finally ini.free; end; end; end; end; end; //CloseFile(f); end; procedure TServer.IdTCPServer1Connect(AThread: TIdContext); begin // end; constructor TServer.Create; begin inherited Create; WriteLn('#######################'); WriteLn('## ##'); WriteLn('## Masterserver '+Serverver+' ##'); WriteLn('## ##'); WriteLn('#######################'); WriteLn(''); IdTCPServer1 := TIdTCPServer.Create(nil); WriteLn('Server wurde initialisiert.'); IdTCPServer1.DefaultPort := 5000; WriteLn('Server lauscht auf Port: '+InttoStr(IdTCPServer1.DefaultPort)); WriteLn(''); IdTCPServer1.TerminateWaitTime := 5000; IdTCPServer1.OnConnect := IdTCPServer1Connect; IdTCPServer1.OnExecute := IdTCPServer1Execute; end; constructor TChatServer.Create; begin inherited Create; Chat := TServerSocket.Create(nil); WriteLn('Chatserver wurde initialisiert.'); Chat.Port := 5002; WriteLn('Chatserver lauscht auf Port: '+InttoStr(Chat.Port)); Chat.OnClientConnect := OnClientConnect; Chat.OnClientDisconnect := OnClientDisconnect; Chat.OnClientRead := OnClientRead; end; var Server : TServer; ChatServer : TChatServer; begin Server := TServer.Create; Server.IdTCPServer1.Active := True; ChatServer := TChatServer.Create; ChatServer.Chat.Active := True; While True do Sleep(50); end. Ich hoffe ihr könnt mir helfen. Vielleicht findet der ein oder andere sogar noch etwas, was man verbessern könnte ![]() |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |