接收端:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, ScktComp, ToolWin;
type
TDataFlag=record
FileName:string;
Filesize:integer;
WorkFlag:integer;
end;
PDataFlag=^TDataFlag;
TForm1 = class(TForm)
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
sv: TServerSocket;
Panel1: TPanel;
RichEdit1: TRichEdit;
Splitter1: TSplitter;
Lv1: TListView;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton4Click(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure svAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure svClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure svClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure svClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure svClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const bufsize=4096;
var
stream:Tmemorystream;
working:boolean;
sendport:integer;
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
sv.Active:=false;
sv.Close;
stream.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stream:=Tmemorystream.Create;
stream.Position:=0;
working:=false;
end;
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
working:=false;
sv.Port:=6768;
sv.Active:=true;
stream.Clear;
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器启动!');
end;
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
if lv1.Items.Count =0 then
exit;
stream.Clear;
working:=false;
sv.Socket.Connections[sendport].SendText('filetransferstop');
richedit1.Lines.Add(datetimetostr(now())+'==>>停止当前接受任务!');
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
caption:='start';
stream.Clear;
working:=true;
sv.Socket.Connections[sendport].SendText('filetransferwork');
richedit1.Lines.Add(datetimetostr(now())+'==>>开始接受文件。');
end;
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
working:=false;
sv.Active:=false;
stream.Clear;
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器停止!');
end;
procedure TForm1.ToolButton5Click(Sender: TObject);
begin
close;
end;
procedure TForm1.svAccept(Sender: TObject; Socket: TCustomWinSocket);
var
newitem:TListItem;
begin
newitem:=lv1.Items.Insert(lv1.Items.Count);
newitem.Caption:='Client:'+inttostr(lv1.Items.Count);
newitem.SubItems.Add(socket.RemoteHost);
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(inttostr(socket.RemotePort));
lv1.AlphaSort;
lv1.Items.Item[0].Selected:=true;
// ('连接到:'+socket.RemoteAddress+'成功!');
// showmessage('连接到:'+socket.RemoteAddress+'成功!');
end;
procedure TForm1.svClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
df:PDataFlag;
begin
df:=new(PDataFlag);
df.FileName:='';
df.Filesize:=0;
df.WorkFlag:=0;
socket.Data:=df;
socket.SendText('已经连接,请准备好要传输的文件!');
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务连接用户:'+socket.RemoteAddress);
end;
procedure TForm1.svClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
begin
for i:=0 to lv1.Items.Count - 1 do
if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
begin
richedit1.Lines.Add(Datetimetostr(now())+'==>>'+lv1.Items[i].Caption+'走了!');
lv1.Items.Item[i].Delete;
exit;
end;
end;
procedure TForm1.svClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
errorcode:=0;
working:=false;
stream.Clear;
end;
procedure TForm1.svClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf:array[0..bufsize] of char;
numberbytes,i:integer;
df:PDataFlag;
cmd:string;
begin
df:=socket.Data;
case df.WorkFlag of
0:
begin
cmd:=trim(socket.ReceiveText);
if pos('FILESEND ',uppercase(cmd))>0 then
begin
df.FileName:=trim(copy(cmd,pos(' ',cmd)+1,length(cmd)));
df.Filesize:=strtoint(copy(df.FileName,pos(' ',df.FileName)+1,length(df.FileName)));
df.FileName:=trim(copy(df.FileName,1,pos(' ',df.FileName)));
df.WorkFlag:=1;
socket.Data:=df;
socket.SendText('文件传送服务准备完毕,可以传送!');
richedit1.Lines.Add(datetimetostr(now())+'==>>文件名:'+df.FileName+' 文件大小:'+inttostr(df.Filesize)+#13#10+'文件传送服务准备完毕,可以接受了!');
end;
end;
1:
begin
if working then
begin
//if socket.RemoteHost then
numberbytes:=socket.ReceiveLength;
socket.ReceiveBuf(buf,numberbytes);
stream.Write(buf,numberbytes);
if numberbytes>=bufsize then socket.SendText('filetransferwork');
if numberbytes<bufsize then
begin
socket.SendText('filetransferstop');
stream.Position:=0;
try
stream.SaveToFile(df.FileName);
richedit1.Lines.Add(datetimetostr(now())+'==>>文件接受完毕!');
df.WorkFlag:=0;
socket.SendText('文件传送服务器准备完毕,可以传输下一个文件!');
except
end;
stream.Clear;
end;
end;
end;
end;
if not working then socket.SendText('filetransferstop');
for i:=0 to lv1.Items.Count - 1 do
if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
begin
sendport:=i;
end;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, ScktComp, ToolWin;
type
TDataFlag=record
FileName:string;
Filesize:integer;
WorkFlag:integer;
end;
PDataFlag=^TDataFlag;
TForm1 = class(TForm)
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
sv: TServerSocket;
Panel1: TPanel;
RichEdit1: TRichEdit;
Splitter1: TSplitter;
Lv1: TListView;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton4Click(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure svAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure svClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure svClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure svClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure svClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const bufsize=4096;
var
stream:Tmemorystream;
working:boolean;
sendport:integer;
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
sv.Active:=false;
sv.Close;
stream.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
stream:=Tmemorystream.Create;
stream.Position:=0;
working:=false;
end;
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
working:=false;
sv.Port:=6768;
sv.Active:=true;
stream.Clear;
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器启动!');
end;
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
if lv1.Items.Count =0 then
exit;
stream.Clear;
working:=false;
sv.Socket.Connections[sendport].SendText('filetransferstop');
richedit1.Lines.Add(datetimetostr(now())+'==>>停止当前接受任务!');
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
caption:='start';
stream.Clear;
working:=true;
sv.Socket.Connections[sendport].SendText('filetransferwork');
richedit1.Lines.Add(datetimetostr(now())+'==>>开始接受文件。');
end;
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
working:=false;
sv.Active:=false;
stream.Clear;
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务器停止!');
end;
procedure TForm1.ToolButton5Click(Sender: TObject);
begin
close;
end;
procedure TForm1.svAccept(Sender: TObject; Socket: TCustomWinSocket);
var
newitem:TListItem;
begin
newitem:=lv1.Items.Insert(lv1.Items.Count);
newitem.Caption:='Client:'+inttostr(lv1.Items.Count);
newitem.SubItems.Add(socket.RemoteHost);
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(inttostr(socket.RemotePort));
lv1.AlphaSort;
lv1.Items.Item[0].Selected:=true;
// ('连接到:'+socket.RemoteAddress+'成功!');
// showmessage('连接到:'+socket.RemoteAddress+'成功!');
end;
procedure TForm1.svClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
df:PDataFlag;
begin
df:=new(PDataFlag);
df.FileName:='';
df.Filesize:=0;
df.WorkFlag:=0;
socket.Data:=df;
socket.SendText('已经连接,请准备好要传输的文件!');
richedit1.Lines.Add(datetimetostr(now())+'==>>文件传送服务连接用户:'+socket.RemoteAddress);
end;
procedure TForm1.svClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
begin
for i:=0 to lv1.Items.Count - 1 do
if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
begin
richedit1.Lines.Add(Datetimetostr(now())+'==>>'+lv1.Items[i].Caption+'走了!');
lv1.Items.Item[i].Delete;
exit;
end;
end;
procedure TForm1.svClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
errorcode:=0;
working:=false;
stream.Clear;
end;
procedure TForm1.svClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf:array[0..bufsize] of char;
numberbytes,i:integer;
df:PDataFlag;
cmd:string;
begin
df:=socket.Data;
case df.WorkFlag of
0:
begin
cmd:=trim(socket.ReceiveText);
if pos('FILESEND ',uppercase(cmd))>0 then
begin
df.FileName:=trim(copy(cmd,pos(' ',cmd)+1,length(cmd)));
df.Filesize:=strtoint(copy(df.FileName,pos(' ',df.FileName)+1,length(df.FileName)));
df.FileName:=trim(copy(df.FileName,1,pos(' ',df.FileName)));
df.WorkFlag:=1;
socket.Data:=df;
socket.SendText('文件传送服务准备完毕,可以传送!');
richedit1.Lines.Add(datetimetostr(now())+'==>>文件名:'+df.FileName+' 文件大小:'+inttostr(df.Filesize)+#13#10+'文件传送服务准备完毕,可以接受了!');
end;
end;
1:
begin
if working then
begin
//if socket.RemoteHost then
numberbytes:=socket.ReceiveLength;
socket.ReceiveBuf(buf,numberbytes);
stream.Write(buf,numberbytes);
if numberbytes>=bufsize then socket.SendText('filetransferwork');
if numberbytes<bufsize then
begin
socket.SendText('filetransferstop');
stream.Position:=0;
try
stream.SaveToFile(df.FileName);
richedit1.Lines.Add(datetimetostr(now())+'==>>文件接受完毕!');
df.WorkFlag:=0;
socket.SendText('文件传送服务器准备完毕,可以传输下一个文件!');
except
end;
stream.Clear;
end;
end;
end;
end;
if not working then socket.SendText('filetransferstop');
for i:=0 to lv1.Items.Count - 1 do
if lv1.Items.Item[i].SubItems.Strings[2]=inttostr(Socket.RemotePort) then
begin
sendport:=i;
end;
end;
end.