请问通过TServerSocket和TClientSocket能实现两个客户端之间的文件传输吗? 通过TServerSocket和TClientSocket能实现两个客户端之间的文件传输吗?我已经在客户端成功显示了在线用户列表,有HANDLE和IP信息。如果这两个控件不能传输文件,那该用什么控件呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这两个也可以传的,把文件把包成流文件再传,你也可以用FPT来传。 可以传递,用SendBuffer,要先将文件分隔成一个个的包收到后在合并起来.得你好好研究一下了.网上有不少的例子. ///给一个例子不过跟你说的不一样你可以看一下修改一下就好了////Clientunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp;type TForm1 = class(TForm) cs: TClientSocket; Button1: TButton; Button2: TButton; lb: TListBox; sd: TSaveDialog; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure csRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); procedure csConnect(Sender: TObject; Socket: TCustomWinSocket); procedure csConnecting(Sender: TObject; Socket: TCustomWinSocket); procedure csDisconnect(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;var Form1: TForm1; mysize:longint; mystream:Tmemorystream; strfilename:string;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);begin if cs.Active then cs.Close; cs.Address:='192.168.18.184'; cs.Port:=20000; cs.Open;end;procedure TForm1.FormCreate(Sender: TObject);begin mystream:=Tmemorystream.create; //½¨Á¢ÄÚ´æÁ÷¶ÔÏó mysize:=0; //³õʼ»¯end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin mystream.free; if cs.active then cs.close;end;procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);var mybuffer:array[0..10000]of byte; //ÉèÖýÓÊÜ»º³åÇø myReceivelength:integer; s:string;begin if mysize=0 then begin s:=socket.ReceiveText; mysize:=strtoint(s); socket.SendText('ready'); end else begin myReceivelength:=socket.ReceiveLength; socket.ReceiveBuf(mybuffer,myReceivelength); lb.Items.Add('Receive buffer:'+ inttostr(myReceivelength)+' K'); mystream.Write(mybuffer,myReceivelength); if mystream.Size >= mysize then begin lb.Items.Add('send over !'); mystream.Position:=0; mystream.SaveToFile(strfilename); mystream.Clear; mysize:=0; end; end;end;procedure TForm1.Button1Click(Sender: TObject);begin sd.Execute; strfilename:=sd.FileName; cs.socket.sendtext('FT'); //·¢ËÍÖ¸Áî֪ͨ·þÎñÆ÷¶Ë´«ÊäÎļþend;procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);begin //showmessage('connection success!'); lb.Items.Add('connection success!');end;procedure TForm1.csConnecting(Sender: TObject; Socket: TCustomWinSocket);begin lb.Items.Add('connectint...');end;procedure TForm1.csDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin lb.Items.Add('connect is over ');end;end.////serverunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;type TForm1 = class(TForm) ss: TServerSocket; op: TOpenDialog; Button1: TButton; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; mysize:longint; mystream:Tmemorystream; strfilename:string;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin if not ss.Active then begin mystream:=Tmemorystream.Create; mystream.Position:=0; ss.Port:=20000; ss.Open; end;end;procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);var strReceive:string;begin strReceive:=socket.ReceiveText; if (strReceive='FT') then begin socket.SendText(inttostr(mysize)); //·¢ËÍÎļþµÄ´óС¹ýÈ¥ end else if (strReceive='ready') then begin socket.SendStream(mystream); end;end;procedure TForm1.Button1Click(Sender: TObject);begin if not op.Execute then begin op.Execute; Op.Filter := 'Text files (*.txt)|*.txt'; strfilename:=op.FileName; mystream.LoadFromFile(strfilename); mysize:=mystream.Size; label1.Caption:='file size is ' + inttostr(mysize) + ' k'; end;end;end. 我要的是客户端与客户端之间的文件传输============================这个可能我也不会,要是我做我要通过一个server 如果是通过server,那是不是要先在server端保存该文件,然后在通过同样的方法传送保存的文件?还是server端不用保存就直接转发给另一个客户端? 我要的是客户端与客户端之间的文件传输 ===============这个不一定能实现,就算是使用的UDP协议也未必能实现。如果是通过server,那是不是要先在server端保存该文件,然后在通过同样的方法传送保存的文件?还是server端不用保存就直接转发给另一个客户端?===============不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。 to unsigned:不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。======================================================================你说的是不是通过 TServerSocket和TClientSocket 就能实现? SaveToStream 的时候提示:Abstract Error 如何复制一个数据库的结构到一个新的数据库 CheckBox组件如何实现多条件查询, quickreport的小问题 如何实现窗口渐渐消失的效果啊 再问如何给别人分数 请问简单的问题: 急,程序在98 Se下报'stack overflow',win2k和xp下却没问题?? 感觉delphi完全是个异性 Delphi中如何实现下面的功能:) 谢谢 DEIPHI开发的应用程序连接INTERBASE数据库在XP下连接速度非常慢! delphi 如何显示 汉字
得你好好研究一下了.网上有不少的例子.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;type
TForm1 = class(TForm)
cs: TClientSocket;
Button1: TButton;
Button2: TButton;
lb: TListBox;
sd: TSaveDialog;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure csConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure csConnecting(Sender: TObject; Socket: TCustomWinSocket);
procedure csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1; mysize:longint;
mystream:Tmemorystream;
strfilename:string;
implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
begin
if cs.Active then cs.Close;
cs.Address:='192.168.18.184';
cs.Port:=20000;
cs.Open;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
mystream:=Tmemorystream.create; //½¨Á¢ÄÚ´æÁ÷¶ÔÏó
mysize:=0; //³õʼ»¯
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
mystream.free;
if cs.active then
cs.close;
end;procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
mybuffer:array[0..10000]of byte; //ÉèÖýÓÊÜ»º³åÇø
myReceivelength:integer;
s:string;begin
if mysize=0 then
begin
s:=socket.ReceiveText;
mysize:=strtoint(s);
socket.SendText('ready');
end
else
begin
myReceivelength:=socket.ReceiveLength;
socket.ReceiveBuf(mybuffer,myReceivelength);
lb.Items.Add('Receive buffer:'+ inttostr(myReceivelength)+' K');
mystream.Write(mybuffer,myReceivelength);
if mystream.Size >= mysize then
begin
lb.Items.Add('send over !');
mystream.Position:=0;
mystream.SaveToFile(strfilename);
mystream.Clear;
mysize:=0;
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
sd.Execute;
strfilename:=sd.FileName;
cs.socket.sendtext('FT'); //·¢ËÍÖ¸Áî֪ͨ·þÎñÆ÷¶Ë´«ÊäÎļþ
end;procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
//showmessage('connection success!');
lb.Items.Add('connection success!');
end;procedure TForm1.csConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
lb.Items.Add('connectint...');
end;procedure TForm1.csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
lb.Items.Add('connect is over ');
end;end.
////server
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;type
TForm1 = class(TForm)
ss: TServerSocket;
op: TOpenDialog;
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1; mysize:longint;
mystream:Tmemorystream;
strfilename:string;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
if not ss.Active then
begin
mystream:=Tmemorystream.Create;
mystream.Position:=0;
ss.Port:=20000;
ss.Open;
end;
end;procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
strReceive:string;
begin
strReceive:=socket.ReceiveText;
if (strReceive='FT') then
begin
socket.SendText(inttostr(mysize)); //·¢ËÍÎļþµÄ´óС¹ýÈ¥
end
else if (strReceive='ready') then
begin
socket.SendStream(mystream);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not op.Execute then
begin
op.Execute;
Op.Filter := 'Text files (*.txt)|*.txt';
strfilename:=op.FileName;
mystream.LoadFromFile(strfilename);
mysize:=mystream.Size;
label1.Caption:='file size is ' + inttostr(mysize) + ' k';
end;
end;end.
===============
这个不一定能实现,就算是使用的UDP协议也未必能实现。如果是通过server,那是不是要先在server端保存该文件,然后在通过同样的方法传送保存的文件?还是server端不用保存就直接转发给另一个客户端?
===============
不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。
不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。
======================================================================
你说的是不是通过 TServerSocket和TClientSocket 就能实现?