線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3846
推到 Plurk!
推到 Facebook!

檔案對傳

答題得分者是:japhen
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-18 15:56:11 IP:210.70.xxx.xxx 訂閱
想請問各位大大D7中好像沒有NUMDP的元件~是否有替代的元件可讓檔案可點對點的互傳~?
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-18 16:12:16 IP:125.229.xxx.xxx 訂閱
傳檔案還是用TCP來傳比較好,個人介紹用INDY的元件來跑,相對簡單點
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-18 16:37:34 IP:210.70.xxx.xxx 訂閱
謝謝大大的回覆~大大是只說Indy Clients和Indy Servers中的
IdTCPClinet跟IdTCPServer嗎??
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-18 17:30:19 IP:125.229.xxx.xxx 訂閱
如果不考慮防火牆穿透的問題,是可以用indy的idTCPServer跟idTCPClient完成你的問題
例子我直接寫在這,以下使用indy 10的版本,如果你的是indy 9 ,請先上indy的官方網站下載更新
第一個程式是server端的,先開一個空的程式,上面放一個idTCPServer元件,屬性defaultport設3001
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,IdContext;

type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
procedure FormCreate(Sender: TObject);
procedure IdTCPServer1Execute(AContext: TIdContext);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
idTCPServer1.Active:=true;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var fs : int64;
readstr,reqstr : string ;
mms : TMemoryStream;
begin
while AContext.Connection.Connected do begin
AContext.Connection.Socket.WriteLn('demo_file_transfer');
readstr:=AContext.Connection.Socket.ReadLn;
if copy(readstr,1,9)='GET_FILE_' then begin
reqstr:=copy(readstr,10,length(readstr)-9);
if fileexists(reqstr) then begin
mms:=TMemoryStream.Create;
mms.LoadFromFile(reqstr);
fs:=mms.Size;
AContext.Connection.Socket.WriteLn('READY_TRANSFERFILE_' inttostr(fs));
AContext.Connection.Socket.Write(mms,fs);
mms.free;
end;
end;

end;
end;

end.

第二個例子是client端,也是做一個新的程式,放一個button在form上就好
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var filesize : int64;
readx :string ;
mms : TMemoryStream;
begin
if fileexists('temp.txt') then deletefile('temp.txt');
with TidTCPClient.Create(self) do begin
host:='127.0.0.1';
port:=3001;
try
connect;
finally
if connected and (socket.ReadLn='demo_file_transfer') then begin
socket.WriteLn('GET_FILE_c:\windows\system.ini');
readx:=socket.ReadLn;
if copy(readx,1,19)='READY_TRANSFERFILE_' then begin
filesize := strtointdef(copy(readx,20,length(readx)-19),0);
if filesize>0 then begin
mms:=TMemoryStream.Create;
socket.ReadStream(mms,filesize);
mms.SaveToFile('temp.txt');
mms.Free;
end;
end;
end;
disconnect;
end;
free;
end;
end;
end.

先執行server端,再打開client端程式,點下client端的button,你會發現client程式所在的資料夾中,多了一個temp.txt的檔案
................有事忙先在此打住,你先練練,有問題再討論


------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-18 23:21:22 IP:125.233.xxx.xxx 訂閱
謝謝大大的範例~我想問一下現在的indy10是不是更新到indy-10.2.0.1了嗎??但我不太會裝indy10說~可以請大大教我一下嗎^^"
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-18 23:26:56 IP:211.74.xxx.xxx 訂閱
只要是indy10就可以用上述範例了,indy9 跟10有很大的差別
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-19 01:38:32 IP:125.233.xxx.xxx 訂閱
謝謝大大給的提示~我在試看看在跟大大回報&^^
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-01-19 23:01:54 IP:125.233.xxx.xxx 訂閱
請問一下大大~在雙方傳輸的過程中~是否可使用OpenDialog1和SaveDialog1嗎???謝謝大大^^
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-01-19 23:07:33 IP:211.74.xxx.xxx 訂閱
因為檔案是在伺服器端,所以你的伺服器在連接之後必需先傳給客戶端一份檔案清單,不然你的客戶端怎麼知道server上有啥東西呢?就跟FTP協議一樣
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-01-19 23:14:18 IP:125.233.xxx.xxx 訂閱
是喔~~!但有辦法使用開檔的方式傳輸嗎?就像坊間一般的即時通訊軟體的傳檔方式?謝謝大大
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-01-19 23:20:15 IP:211.74.xxx.xxx 訂閱
OPENDIALOG肯定不行,你要OPEN什麼?當然是來自遠端的檔案,但那種DIALOG就肯定不是系統所提供的,而是你自己寫的對話框~

至於SAVEDIALOG那是你客戶端要存放檔案的地方,用SAVEDIALOG來決定把檔案放哪,這當然是最好~~
在上述的例子中,客戶端要執行 mms.SaveToFile('temp.txt'); 之前加一行 IF SAVEDIALOG.EXECUTE THEN

當然,在CLIENT的FORM上一定要放一個SAVEDIALOG



------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-01-19 23:24:18 IP:125.233.xxx.xxx 訂閱
但在傳輸檔案前不是要些指定所要傳輸的檔案~在這部份不是須要使用open來先開啟他~??對方在觸發save的部份接收??~謝謝大大
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-01-19 23:28:05 IP:211.74.xxx.xxx 訂閱
但你的SERVER端肯定也是無人值守吧,DIALOG要誰去控制呢?.........SO.........CLIENT跟SERVER連線確定身份之後的第一件事,就是從SERVER上取得一份完整的檔案列表,然後在客戶端列示,讓客戶自己選定下載
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-01-19 23:32:28 IP:125.233.xxx.xxx 訂閱
是喔~!!所以就是說沒有辦法像我剛剛說的方式傳輸囉??但我好像之前在ktop上看到領航大大寫的一支程式好像可以直接對傳說~但可惜的是他使用的nmupd~這我就不太會了~"~謝謝大大
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-01-20 00:11:41 IP:210.66.xxx.xxx 訂閱
呵呵,我知道你說的東西了~~~~我明天有空給你寫個範例試試吧~~那不是不行,而是我沒理解你的問題
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-01-20 00:46:33 IP:125.233.xxx.xxx 訂閱
呵呵~!!我就是想寫類似領航大大寫的那種程式~因為我有用過執行檔~覺得滿好用的~!但那個nmupd的元件我搞不定~"~所以才問有沒有代替的元件可以像他一樣可以直接輸入對方的ip就可以直接對傳檔案~真的很麻煩大大~"~感謝!!
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-01-21 02:58:43 IP:211.74.xxx.xxx 訂閱
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=86339
我把範例做在上列聯結中,請自行下載測試(不含執行檔).......
------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#18 引用回覆 回覆 發表時間:2007-01-21 12:35:28 IP:220.140.xxx.xxx 訂閱
真不好意思麻煩大大那麼晚才休息~正下載下來研究~有問題會回報給大大的^^感恩
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2007-01-22 02:47:07 IP:125.231.xxx.xxx 訂閱
大大~不好意思請問一下~在對傳的時候他ip位子是不是鎖死在裡面的?有辦法可以讓使用者自己輸入嗎
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2007-01-23 21:00:54 IP:220.140.xxx.xxx 訂閱
大大~不好意思我想問一下我為什麼在執行的時候server傳給client檔案時是ok的~但client傳給server的時候會出現error呢~感恩!
sky810675
一般會員


發表:5
回覆:23
積分:5
註冊:2006-07-21

發送簡訊給我
#21 引用回覆 回覆 發表時間:2007-01-31 09:27:04 IP:140.128.xxx.xxx 訂閱
測試後是可以的~!!但裡面有一些寫法不太清楚~不知道可不可以問大大一下
系統時間:2024-04-26 11:22:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!