通过TServerSocket和TClientSocket能实现两个客户端之间的文件传输吗?我已经在客户端成功显示了在线用户列表,有HANDLE和IP信息。如果这两个控件不能传输文件,那该用什么控件呢?
解决方案 »
- 关于HOOK自定义消息的问题
- eof()结束不了一个文件,请大家帮忙?
- FindResource的用法
- 不知道大家有没有启发?长大后,能聊天的人少了.
- 请教,TAnimat控件为什么无法打开AVI的文件?为什么总是报告"can not open AVI"?
- 100分求:dxDBLookupEdit下拉列表能不能随键盘输入下拉内容实现过滤或定位功能
- 如何用WAVE开头的API进行即时录音放音编程
- 有谁知道??
- 关于设计登陆密码的问题!
- 请问分别已知每帧的长度,如何算出播放一首MP3所需的时间?
- 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 就能实现?