27-04-2020, Saat: 00:43
İyi günler öncelikle
Socketi Thread içerisinde kullanıyorum fakat thread çalışıyor ClientSocketde öyle bağlanıyor ama hemen arkasından sanırım thread ta kapanıyor Sockette yardımcı olabilecek varmı?
Socketi Thread içerisinde kullanıyorum fakat thread çalışıyor ClientSocketde öyle bağlanıyor ama hemen arkasından sanırım thread ta kapanıyor Sockette yardımcı olabilecek varmı?
unit unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;
type
TClientSockThread = class(TThread)
private
fIp: string;
fClientSocket: TClientSocket;
procedure ClntConnect(Sender: TObject; Socket: TCustomWinSocket);
protected
procedure DoTerminate; override;
procedure Execute; override;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
property Clnt: TClientSocket read fClientSocket write fClientSocket;
private
FStream: TFileStream;
public
constructor Create(Ip: string);
end;
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TClientSockThread.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
FStream := TFileStream.Create('C:\Users\hkesk\Desktop\XxXxXx\Win32\Debug\down\somine.mkv', fmCreate or fmShareDenyWrite);
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
begin
TClientSockThread.Create('127.0.0.1');
end;
{ TClientSockThread }
procedure TClientSockThread.ClntConnect(Sender: TObject; Socket:
TCustomWinSocket);
begin
//formdaki memo yada liste kutusuna baglı olanı ekle
Form2.Memo1.Lines.Add(Socket.RemoteAddress+' | '+Socket.RemoteHost);
end;
constructor TClientSockThread.Create(Ip: string);
begin
inherited Create(False);
fIp := Ip;
//thread kapanırken kendini sonlandırır.
//bu ozellik bu gibi durumlarda cok ise yaramakta
FreeOnTerminate := True;
end;
procedure TClientSockThread.DoTerminate;
begin
//thread sonlanırken clientsocket nesnesi yokedilir.
fClientSocket.Free;
inherited DoTerminate;
end;
procedure TClientSockThread.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);
var
I: Integer;
begin
Form2.Memo1.Lines.Add('Çıktı..');
end;
procedure TClientSockThread.Execute;
begin
//socket create edilir.
fClientSocket := TClientSocket.Create(nil);
with fClientSocket do
try
try
Port := 5050;//herhangi bir portno
ClientType := ctBlocking;//NonBlocking calısmıyor.
Address := fIp;
OnConnect := ClntConnect;//baglantı gerceklesince calısacak
OnDisConnect := Clientsocket1DisConnect;
onread:= ClientSocket1Read;
Active := True;
finally
Active := False;
end;
except
//baglı olmayan makinalar icin hata verecek
end;
end;
end.