• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

求教?delphi下怎么实现网络文件传输?

istrue 2004-06-07 05:21:50
我想在在delphi下实现文件传输,不想用ftp等,
想用indy中的idtcpclient与idtcpserver实现。
我的实际难题为怎么把一个字符串与一个文件打包一起传送给另一个端???
...全文
430 点赞 收藏 13
写回复
13 条回复
istrue 2004年06月14日
已经用流的形式解决了!
鱼鱼菜鸟在此谢谢各位了!
具体代码过几天贴出来!
回复 点赞
cronuz 2004年06月10日
REC_SIZE = SizeOf(data_record);
stream.WriteBuffer(data_send, REC_SIZE);

(注:一個数据结构record、一斉装入如何?)
回复 点赞
huluobowangmeng 2004年06月10日
冲顶!!
回复 点赞
Sunniness 2004年06月10日
学习!
回复 点赞
hejunwu201 2004年06月10日
学习!
回复 点赞
gcxlh 2004年06月10日
xuexi
回复 点赞
juliens 2004年06月10日
关注
回复 点赞
istrue 2004年06月10日
cronuz(cronuz):
文件不能一齐装入传送的!
回复 点赞
istrue 2004年06月10日
请各位帮手看看以下代码哪里有问题(导致连接中断)?

function send_data(data_send:in_data):boolean;
var
this_connect:connect;
stream:TMemoryStream;
fs:tfilestream;
begin
this_connect:=find_id(data_send.con_id);
if this_connect.thread_id>0 then
begin
{
type
data_record=record
con_code:smallint;//操作码
con_id:integer;//发送目的id号
mess_len:integer;//消息长度
file_size:int64;//文件长度
name_size:smallint;//文件名的长度
filename:string;//文件名
mess:string;//消息体,文本格式
end;
}
stream:=TMemoryStream.Create;
stream.WriteBuffer(data_send.con_code,sizeof(data_send.con_code));
stream.WriteBuffer(data_send.con_id,sizeof(data_send.con_id));

data_send.mess_len:=length(data_send.mess);
stream.WriteBuffer(data_send.mess_len,sizeof(data_send.mess_len));
stream.WriteBuffer(data_send.mess[1],data_send.mess_len);

if fileexists(data_send.filename) then
begin
data_send.name_size:=length(data_send.filename);
fs:=tfilestream.Create(data_send.filename,fmopenread);
data_send.file_size:=fs.Size;

stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小
stream.WriteBuffer(data_send.name_size,sizeof(data_send.name_size));//发送文件名大小
stream.WriteBuffer(data_send.filename[1],data_send.name_size);//发送文件名
stream.WriteBuffer(fs,data_send.file_size);//发送文件体
fs.Free;
end
else
begin
data_send.file_size:=0;
stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小0
end;

this_connect.objects.Connection.WriteStream(stream,true,true);
stream.Free;
result:=true;
end
else
result:=false;
end;
回复 点赞
cjf1009 2004年06月10日
mark
回复 点赞
istrue 2004年06月08日
感谢以上mbzdh与aiirii两位兄弟!
我刚入门不久,看了以上回复,还不能解决,请再多多赐教!
比方以下数据结构在:
type data=record
id:smallint;
mess:string[80];
filename:string[40];//里面存放的为要交换的文件名(包括路径)
end;
帮忙写一个打包发送与接收分解的过程。
我会尽快结贴!

先谢为敬!!!
回复 点赞
aiirii 2004年06月07日
...send a file from a TServerSocket to a TClientSocket?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
btnTestSockets: TButton;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnTestSocketsClick(Sender: TObject);
private
FStream: TFileStream;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FStream := nil;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Assigned(FStream) then
begin
FStream.Free;
FStream := nil;
end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite));
end;

procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
ServerSocket1.Active := True;
ClientSocket1.Active := True;
end;

end.
回复 点赞
mbzdh 2004年06月07日
用idtcpclient和idtcpserver的sendstream就可以了,

你把要发送的文件和字符串打包在 某个流里就可以了,

回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1465

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告