Thread,Socket ou afins

Delphi

09/02/2004

Uso esse exemplo retirado do Dlphi:

unit Chatmain;

interface

uses
Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
type
TForm1 = class(TForm)
memRecv: TMemo;
Panel1: TPanel;
memSend: TMemo;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
edtRemoteHost: TEdit;
Label2: TLabel;
edtRemotePort: TEdit;
Label3: TLabel;
edtLocalPort: TEdit;
btnActivateServer: TButton;
TcpClient1: TTcpClient;
TcpServer1: TTcpServer;
Button1: TButton;
procedure btnSendClick(Sender: TObject);
procedure TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
procedure btnActivateServerClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TClientDataThread = class(TThread)
private
public
ListBuffer :TStringList;
TargetList :TStrings;
procedure synchAddDataToControl;
constructor Create(CreateSuspended: Boolean);
procedure Execute; override;
procedure Terminate;
end;

var
Form1: TForm1;

implementation

{$R *.xfm}
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := true;
ListBuffer := TStringList.Create;
end;

procedure TClientDataThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;

procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;

procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;

procedure TForm1.btnActivateServerClick(Sender: TObject);
begin
TcpServer1.LocalPort := edtLocalPort.Text;
TcpServer1.Active := True;
end;

procedure TForm1.btnSendClick(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
try
if TcpClient1.Connect then
for I := 0 to memSend.Lines.Count - 1 do
TcpClient1.Sendln(memSend.Lines[I]);
finally
TcpClient1.Disconnect;
end;
end;

procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
begin
DataThread:= TClientDataThread.Create(true);
DataThread.TargetList := memRecv.lines;
DataThread.ListBuffer.Add(´*** Connection Accepted ***´);
DataThread.ListBuffer.Add(´Remote Host: ´ + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
´ (´ + ClientSocket.RemoteHost + ´)´);
DataThread.ListBuffer.Add(´===== Begin message =====´);
s := ClientSocket.Receiveln;
while s <> ´´ do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
DataThread.ListBuffer.Add(´===== End of message =====´);
finally
DataThread.Resume;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
TcpClient1.RemoteHost := edtRemoteHost.Text;
TcpClient1.RemotePort := edtRemotePort.Text;
try
if TcpClient1.Connect then
for I := 0 to memSend.Lines.Count - 1 do
TcpClient1.Sendln(memSend.Lines[I]);
finally
TcpClient1.Disconnect;
end;
end;

end.

Gostaria de saber oque tenho que fazer para se quando tentar enviar uma menssagen para um client nao conectado o aplicativo nao fique em looping infinito,
Uso o TcPclient e TcPserver da palleta Internet no Delphi 7.


Kroki

Kroki

Curtidas 0

Respostas

Kroki

Kroki

09/02/2004

Ta dificil?


GOSTEI 0
Kroki

Kroki

09/02/2004

Sera que alguem nao pode dar uma força,to precisando mesmo.


GOSTEI 0
Nildo

Nildo

09/02/2004

Eu não entendi uma coisa...
Como que ele vai enviar uma mensagem para um client que está desconectado?

Você deveria no mínimo ter um controle. Poderia até ser uma Array de Record. Exemplo:

Type
TUsuario = record
Nick: string;
IP: string;
end;

var
Usuarios: array of TUsuario

Dae quando alguem se conectar você almenta 1 na array e preenche os dados. Quando alguem se desconectar, você pega o IP desse alguem, faz uma pesquisa na Array e exclui o item que contém o IP igual ao dele. Assim você vai ter o controle de quem esta conectado.


GOSTEI 0
Kcl

Kcl

09/02/2004

Se você usar o serversocket e o clientsocket, ao se conectarem o serversocket guarda a lista dos ips de maquinas conectas a ele


GOSTEI 0
Kroki

Kroki

09/02/2004

Nildo,é muito simples;
Quando ao enviar a messagem ao Client e a maquina dele ´cair´a conexao...


GOSTEI 0
Kroki

Kroki

09/02/2004

Completando,o problema esta no Bottun1.Clike.
Se ao enviar a menssagem e o Client nao estiver presente a aplicação trava.
Ele pode ter caido a conexao ou reiniciado o PC,então...problemas.


GOSTEI 0
Randallo

Randallo

09/02/2004

Colegas, um Up aí, estou com o mesmo problema e a questão não foi solucionada.
Muito Obrigado.


GOSTEI 0
Ipc$

Ipc$

09/02/2004

Não sei quanto ao TcpServer, mas no TServerSocket é gerado o evento onClientError, onde vc pode controlar a exceção; se deixar var ErrorCode = 0, a exceção não é lançada no sistema.


GOSTEI 0
POSTAR