Fórum Thread,Socket ou afins #212549

09/02/2004

0

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

Responder

Posts

09/02/2004

Kroki

Ta dificil?


Responder

Gostei + 0

09/02/2004

Kroki

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


Responder

Gostei + 0

10/02/2004

Nildo

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.


Responder

Gostei + 0

10/02/2004

Kcl

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


Responder

Gostei + 0

10/02/2004

Kroki

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


Responder

Gostei + 0

10/02/2004

Kroki

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.


Responder

Gostei + 0

24/10/2005

Randallo

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


Responder

Gostei + 0

25/10/2005

Ipc$

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar