Fórum Thread,Socket ou afins #212549
09/02/2004
0
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
Curtir tópico
+ 0Posts
09/02/2004
Kroki
Gostei + 0
09/02/2004
Kroki
Gostei + 0
10/02/2004
Nildo
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
10/02/2004
Kcl
Gostei + 0
10/02/2004
Kroki
Quando ao enviar a messagem ao Client e a maquina dele ´cair´a conexao...
Gostei + 0
10/02/2004
Kroki
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
24/10/2005
Randallo
Muito Obrigado.
Gostei + 0
25/10/2005
Ipc$
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)