Thread,Socket ou afins
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.
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
Curtidas 0
Respostas
Kroki
09/02/2004
Ta dificil?
GOSTEI 0
Kroki
09/02/2004
Sera que alguem nao pode dar uma força,to precisando mesmo.
GOSTEI 0
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.
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
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
09/02/2004
Nildo,é muito simples;
Quando ao enviar a messagem ao Client e a maquina dele ´cair´a conexao...
Quando ao enviar a messagem ao Client e a maquina dele ´cair´a conexao...
GOSTEI 0
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.
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
09/02/2004
Colegas, um Up aí, estou com o mesmo problema e a questão não foi solucionada.
Muito Obrigado.
Muito Obrigado.
GOSTEI 0
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