给现在为SOCK头疼的人
wofan 2004-08-31 03:10:50 相信对你们会有所帮助。把以下的代码改一改就可以加入到你们的程序中了
如果认为还行的话就顶一下吧
SERVER
==========================================================================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ServerSocket: TServerSocket;
end;
var
Form1: TForm1;
implementation
var
count:integer;
id:boolean;
fname:string;
fsize:integer;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket:=TServerSocket.Create(Self);
ServerSocket.Active:=False;
ServerSocket.Port:=1024;
ServerSocket.ServerType:=stNonBlocking;
ServerSocket.OnClientConnect:=ServerSocketClientConnect; //ONCE TEHER ARE CONNECTIONS
ServerSocket.OnClientDisconnect:=ServerSocketClientDisconnect;
ServerSocket.OnClientRead:=ServerSocketClientRead;
button2.Enabled:=false;
count:=0;
id:=false;
end;
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,p1,p2,p3:integer;
st,st1:string;
buf:pointer;
fs:tfilestream;
begin
if(id) then
begin
id:=false;
fs:=Tfilestream.Create('d:\ftp\'+fname,fmCreate or fmOpenWrite);
getmem(buf,fsize);
Socket.ReceiveBuf(buf^,fsize);
fs.Write(buf^,fsize);
freemem(buf);
fs.Free;
end;
edit1.Text:=Socket.RemoteHost;
edit2.Text:=Socket.RemoteAddress;
if(not id) then
st1:=socket.ReceiveText;
edit3.Text:=st1;
if(pos('/',st1)>0) then
begin
id:=true;
p1:=1;
p2:=pos('*',st1);
p3:=pos('a',st1);
fname:=copy(st1,2,p2-p1-1);
fsize:=strtoint(copy(st1,p2+1,p3-p2-1));
showmessage(fname+'--'+inttostr(fsize));
end;
end;
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('server :one client cinnect');
end;
procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('server :one client discinnect');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
inc(count);
if(count=1) then
begin
ServerSocket.Active:=true;
button1.Enabled:=false;
button2.Enabled:=true;
end
else
begin
count:=100;
ServerSocket:=TServerSocket.Create(Self);
ServerSocket.Active:=False;
ServerSocket.Port:=1024;
ServerSocket.ServerType:=stNonBlocking;
ServerSocket.OnClientConnect:=ServerSocketClientConnect; //ONCE TEHER ARE CONNECTIONS
ServerSocket.OnClientDisconnect:=ServerSocketClientDisconnect;
ServerSocket.OnClientRead:=ServerSocketClientRead;
ServerSocket.Active:=true;
button1.Enabled:=false;
button2.Enabled:=true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket.Active:=false;
ServerSocket.Free;
button1.Enabled:=true;
button2.Enabled:=false;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to ServerSocket.socket.ActiveConnections-1 do
begin
if ServerSocket.Socket.Connections[i].RemoteAddress='127.0.0.1' then
ServerSocket.Socket.Connections[i].SendText('from server to 10.119.148.68');
end;
end;
end.
==========================================================================================
CLIENT
******************************************************************************************
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, ExtCtrls; //SCKTCOMP!
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ClientSocketDisconnect(Sender: TObject;Socket: TCustomWinSocket);
procedure ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
ClientSocket: TClientSocket;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var
fname:string;
fsize:integer;
{$R *.DFM}
{close socket when close form}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket.Active := False;
end;
{display connection information}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket.Active := true;
button1.Enabled:=false;
button4.Enabled:=true;
button2.Enabled:=true;
button3.Enabled:=false;
end;
procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
showmessage('CLIENT:disconnect event!'); // server close or client disconnect
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket:=TClientSocket.Create(Self); ///DYNAMIC CREATE TCLIENT SCOEKT
ClientSocket.Active:=False;
ClientSocket.Address:= '10.32.100.93';
ClientSocket.ClientType:=ctNonBlocking;
ClientSocket.Port:=1024;
ClientSocket.OnDisconnect:=ClientSocketDisconnect;
ClientSocket.OnRead:=ClientSocketRead;
button1.Enabled:=true;
button4.Enabled:=false;
button2.Enabled:=false;
button3.Enabled:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
fs:Tfilestream;
senddata:string;
begin
if(not OpenDialog1.Execute) then exit;
fname:=OpenDialog1.FileName;
fs:=Tfilestream.Create(fname,fmopenread);
fsize:=fs.Size;
fs.Free;
button2.Enabled:=false;
button3.Enabled:=true;
senddata:='/'+extractfilename(fname)+'*'+inttostr(fsize)+'a';
ClientSocket.Socket.SendText(senddata);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
fs:Tfilestream;
buf:pointer;
begin
fs:=Tfilestream.Create(fname,fmopenread);
getmem(buf,fsize);
fs.Read(buf^,fsize);
ClientSocket.Socket.SendBuf(buf^,fsize);
freemem(buf);
fs.Free;
button2.Enabled:=true;
button3.Enabled:=false;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket.Active := false;
button1.Enabled:=true;
button4.Enabled:=false;
end;
procedure TForm1.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
begin
//showmessage('read'+ClientSocket.Socket.re);
showmessage( ClientSocket.Socket.ReceiveText);
end;
end.
******************************************************************************************