Hola amigos de clubdelphi. Quiciera comentarles que me encuentro desarrollando un juego en flash y dado que es multiplayer he tenido que tomar a delphi + indy como las opciones para crear un servidor para la aplicacion.
Todo funciona bien. Pero el problema es que por cada conexion que se crea, tengo que tener una cantidad de datos que me hacen falta y todo ello lo guardo en un puntero a un objeto que me dan los context de la Indy. O sea asi de esta manera.
Código Delphi
[-]
type TClient = record
Host : String[255]; Hora_Login : String[255]; Thread : Pointer;
end;
type PClient = ^TClient;
procedure TForm1.TCPServerConnect(AContext: TIdContext);
var
NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));
NewClient.Host := AContext.Connection.Socket.Binding.PeerIP;
NewClient.Hora_Login := FormatDateTime('hh:mm:ss - dd/mm/yyyy', Now);
TIdContext(TCPServer.Contexts.LockList.Items[TCPServer.Contexts.LockList.Count -1]).Data := TObject(NewClient);
TCPServer.Contexts.UnlockList;
Memo1.Lines.Add('Alguien se ha conectado desde: ' + PClient(AContext.Data).Host );
Memo1.Lines.Add('y en fecha/hora: ' + PClient(AContext.Data).Hora_Login );
Memo1.Lines.Add(DupeString('-', 50));
end;
Esto me funciona bien, pero cuando conecto otro cliente me comienza a dar errores y se me conjela la app pincipal que tengo que tumbarla de los procesos. Alguien sabe como puedo hacer eso que quiero de la forma correcta ?. Aqui pongo toda la unit para que se entienda mas !!!
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdIntercept, IdIOHandler, IdIOHandlerStream, xmldom,
XMLIntf, msxmldom, XMLDoc, xercesxmldom, oxmldom, IdIOHandlerSocket,
IdIOHandlerStack, IdSSL, IdSSLOpenSSL, JvSimpleXml, JvExControls,
JvEditorCommon, JvUnicodeEditor, JvExStdCtrls, JvRichEdit,
JvUnicodeHLEditor, JvHLEditorPropertyForm, ImgList, ComCtrls, ExtCtrls,
XPMan, ToolWin, Menus, XPStyleActnCtrls, ActnList, ActnMan,
IdUserPassProvider, IdSASL, IdSASLUserPass, IdSASLDigest, JvExExtCtrls,
JvExtComponent, JvRollOut, JvWizard, Sockets, AdvShapeButton, IdContext,
IdCustomTCPServer, IdTCPServer;
type TClient = record
Host : String[255]; Hora_Login : String[255]; Thread : Pointer;
end;
type PClient = ^TClient;
type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
Panel2: TPanel;
Panel3: TPanel;
Memo1: TMemo;
TCPServer: TIdTCPServer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
procedure TCPServerConnect(AContext: TIdContext);
procedure TCPServerExecute(AContext: TIdContext);
procedure Button1Click(Sender: TObject);
procedure TCPServerDisconnect(AContext: TIdContext);
procedure Button2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
var
Form1 :TForm1;
implementation
{$R *.dfm}
uses StrUtils, IdBuffer, unConfigCon, IdTask;
procedure TForm1.TCPServerConnect(AContext: TIdContext);
var
NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));
NewClient.Host := AContext.Connection.Socket.Binding.PeerIP;
NewClient.Hora_Login := FormatDateTime('hh:mm:ss - dd/mm/yyyy', Now);
TIdContext(TCPServer.Contexts.LockList.Items[TCPServer.Contexts.LockList.Count -1]).Data := TObject(NewClient);
TCPServer.Contexts.UnlockList;
Memo1.Lines.Add('Alguien se ha conectado desde: ' + PClient(AContext.Data).Host );
Memo1.Lines.Add('y en fecha/hora: ' + PClient(AContext.Data).Hora_Login );
Memo1.Lines.Add(DupeString('-', 50));
end;
procedure TForm1.TCPServerExecute(AContext: TIdContext);
var
dato: String;
vIP: String;
List: TList;
vCount: Integer;
begin
dato := AContext.Connection.Socket.ReadLn();
Memo1.Lines.Add(#13 + DupeString('=', 30));
Memo1.Lines.Add('Hora_Login: ' + PClient(AContext.Data).Hora_Login );
Memo1.Lines.Add('Enviado: ' + dato);
List := TCPServer.Contexts.LockList;
try
for vCount := 0 to List.Count -1 do
try
vIP := PClient(TIdContext(List.Items[vCount]).Data).Host;
TIdContext(List.Items[vCount]).Connection.Socket.WriteLn(vIP + ': ' + dato);
except
end;
finally
TCPServer.Contexts.UnlockList;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TCPServer.Active := False;
TCPServer.Active := True;
end;
procedure TForm1.TCPServerDisconnect(AContext: TIdContext);
begin
AContext.Data := nil;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
List: TList;
Count: Integer;
vDatos: PClient;
begin
List := TCPServer.Contexts.LockList;
try
for Count := 0 to List.Count -1 do
try
vDatos := PClient( TIdContext(List.Items[Count]).Data);
Memo1.Lines.Add('Hora Login: ' + vDatos.Hora_Login);
except
end;
finally
TCPServer.Contexts.UnlockList;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
TCPServer.StopListening;
TCPServer.Active := False;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
List: TList;
Count: Integer;
begin
List := TCPServer.Contexts.LockList;
try
for Count := 0 to List.Count -1 do
try
TIdContext(List.Items[Count]).Connection.Disconnect(True);
except
end;
finally
TCPServer.Contexts.UnlockList;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
end.