用IdTCPClient来发送?那么接收数据呢?
解决方案 »
- 有没有比while not do 循环起来快的方法
- 字符数组给string赋值报stack overflow是什么问题?
- 100分问一个比较深的问题
- 在Delphi 中附加数据库怎么写代码呀!(在线等待各位的良言了!)
- Treader类的问题
- 映射服务器的问题
- 关于fastreport2.4的一个小问题,在线等,,
- http://www.cuniware.com/zhaqiong/Delphi7.rar 这里下载的Delphi7.rar 为什么用rar工具解压缩时会出错!??
- 能否用变量替代SQL命令行运行???
- 用过ADO的老兄帮忙看一下这个错误为什么?拜托了!
- 如何使txt文件转换成bmp文件?
- 数据库数据放到edit中的问题,弱弱的问题
IdTCPClient怎样发送消息的?能不能把代码发出来看看?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,Math;type
TForm1 = class(TForm)
Button1: TButton;
IdTCPServer1: TIdTCPServer;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
aFileStream:tFileStream;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
AFileStream := TFileStream.Create('c:\aa.xml', fmOpenRead);
IdTCPServer1.DefaultPort :=2222;
if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//AFileStream.Free;
IdTCPServer1.Active := False;
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd: string; //接收到客户端的字符串信息
ASize: Integer; //需要传输的流大小
begin
with AThread.Connection do //已经连街上的一个进程
begin
cmd := UpperCase(ReadLn); //客户端发送的命令字符串
if cmd = 'BEGIN' then //开始传输
begin
//告诉远程传输文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size, 'aa.xml']));
//StatusBar1.SimpleText := '准备传输...';
Exit;
end;
if cmd = 'END' then
begin //传输完成
//Button3.Click;
//StatusBar1.SimpleText := '传输完成...';
AFileStream.Free;
Exit;
end;
if cmd = 'CANCEL' then
begin //传输取消
//StatusBar1.SimpleText := '传输取消...';
//保持传输状态
Exit;
end;
//按照指定位置传输文件
AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
//计算需要发送的大小,Min()函数在Math单元
OpenWriteBuffer; //准备发送缓冲
WriteStream(AFileStream, false, false, ASize);
//注意这个函数的参数。
CloseWriteBuffer; //结束发送缓冲
//StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);
//ProgressBar1.Position := ProgressBar1.Position + ASize;
end;
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
StdCtrls,math;type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
IdTCPClient1: TIdTCPClient;
Button2: TButton;
Edit1: TEdit;
function getF(sFilePath,sIP:string;iPort:Integer):integer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
function TransListen(H:THandle;sFileName:String):integer;cdecl;external'Project1.dll';
{$R *.dfm}function TForm1.getF(sFilePath, sIP: string; iPort: Integer): integer;
var
IdTCPClient2: TIdTCPClient;
cmd: string;
ASize, TotalSize: Int64;
AFileStream: TFileStream;
begin
IdTCPClient2:=TIdTCPClient.Create(application);
IdTCPClient2.Host:=sIP;
IdTCPClient2.Port:=iPort;
try
IdTCPClient2.Connect(2000);
except
showmessage('网络不通。');
result:=0;
exit;
end; try
try
IdTCPClient2.WriteLn('BEGIN'); //提示服务器开始接收
cmd := IdTCPClient2.ReadLn;
//以“|”符号分离文件名
//SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd)); TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
//建立文件流准备接收
AFileStream := TFileStream.Create('d:\bb.xml', fmCreate);
try //循环开始接受
repeat
IdTCPClient2.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
ASize := Min(TotalSize - AFileStream.Size, IdTCPClient2.RecvBufferSize);
//选择剩余大小和缓冲区大小小的一个作为传输的大小
IdTCPClient2.ReadStream(AFileStream, ASize); //接收流
//StatusBar1.SimpleText := Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
Application.ProcessMessages;
until AFileStream.Size = TotalSize; //大小一致了表示结束
finally
AFileStream.Free; //释放文件流
end;
IdTCPClient2.WriteLn('END'); //提示服务器传输完成
//StatusBar1.SimpleText := '传输完成...';
result:=1;
except
//StatusBar1.SimpleText := '连接服务器失败或者对方已经中断传输!';
result:=0;
end;
finally
IdTCPClient2.Disconnect;
IdTCPClient2.Free;
end;
//result:=1;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(getF('aa','192.168.0.67',2222)));
end;procedure TForm1.Button2Click(Sender: TObject);
begin
TransListen(application.Handle,edit1.Text);
end;end.