怎樣把一張JPEG放進byteArray內? |
尚未結案
|
joe_ung
一般會員 發表:12 回覆:21 積分:6 註冊:2003-10-16 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
joe_ung
一般會員 發表:12 回覆:21 積分:6 註冊:2003-10-16 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
這篇烏龍鬧大了,這篇樓主好像給分給錯人了........我啥都沒做,莫名奇妙拿到分,這下子我非答不可囉!
以下的例子是我寫來做局網里做p2p的檔案傳輸用的,全部用indy的tcp/udp的元件來處理。
當我需要一個檔案的時候,就用udp對局網內的所有電腦做broadcast詢問『誰有我要的檔案,檔名是xxx.abc,大小是nnnn bytes,CRC是$00ABCDEF』(前述的數字是假設數字),這時這局網里十台電腦,有一台里有我要的東西(PC-A),於是用TCP開始接洽是否可以丟檔案給我的電腦,當然TCP必須要建立THREAD來處理這個TCP連線的工作,不然同時一堆電腦同時發生通訊請求,不就塞車?第一個回答我的電腦出現後,我為了要停止後來的人再傳檔過來,我設sendercount:=1,再把PC-A的IP記下來,後來的thread檢查如果sendercount>0的話就terminate掉不再繼續....
PC-A打開tcp server,綁在8888 port
電腦就是tcp client,打開到PC-A的port8888去
二台電腦連上之後開始進行handshaking~(確定傳送協定的握手交談的動作),以下開始傳檔 我的電腦TCP CLIENT端
procedure DownLoadfile(xfn:string); var xfile : TFileStream; sResp:string; begin WITH idTCPClient1 do begin idTCPClient1.Port:=8888; idTCPClient1.host:=10.10.1.1; // PC-A的ip idTCPClient1.Connect ; while Connected do begin xfile:= TFileStream.Create(xfn,fmCreate or fmShareExclusive); //與server端建立連線成功之後,先建立一個filestream準備接收檔案 try sRESP:=READLN; if sRESP<>'JAPHEN'S TCP Peer to Peer Sharing' then break; // 如果對方回答我的不是共同的語言,就中斷所有的連接動作 writeln('GETINGFILE_' xfn); // 向PC-A要求我要的檔案 readstream(xfile,-1,true); finally Disconnect ; // 總算完成(依檔案大小來決定所花時間),中斷連接 xfile.free; // 關閉檔案(這時也寫入完成了,檢查一下是不是接收到了吧) end; end; end; end;server端(PC-A,裡面有我要的檔案的電腦) procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread); VAR SREQ ,prefile: STRING ; FStream : TFileStream; begin ATHREAD.Connection.WriteLN('JAPHEN'S TCP Peer to Peer Sharing'); //連線建立後,回傳個訊息給client端 try SREQ:=READLN; if copy(SREQ,1,11)='GETINGFILE_' then begin // 如果對方跟我要檔案的話,往下繼續 prefile := copy(SREQ,12,length(SREQ)-11); if fileexists(prefile) then begin //檢查一下檔案存不存在 try FStream:=TFileStream.Create(prefile,fmOpenRead or fmShareDenyNone); //打開要送出去的檔案 fstream.Seek(0,soFromBeginning); //檔案指標指到最開頭 ATHREAD.Connection.openwritebuffer; // 打開TCP WRITEBUFFER ATHREAD.Connection.writestream(fStream); //把檔案FSTREAM直接丟出去,沒限制大小 ATHREAD.Connection.Closewritebuffer;//關閉TCP WRITEBUFFER(全都送完了) finally freeandnil(FStream); end; end; end; finally ATHREAD.Connection.disconnect ; end; END; end;可能有人會問只要WRITEBUFFER只要一次就可以傳完成千上萬MB甚至2G 3G的資料,會不會有問題?網卡不是笨蛋,TCP協定也不是丟了就不管,所有的資料封包最後都有個CRC,在傳完每個封包之後,網卡自動會檢查封包是否有錯,如果錯了,由網卡發起自動重送(資料連結層的事,AP管不著也不用管),至於INDY TCP元件的角色,負責會議層的工作,把檔案資料切割成一個封包最大能傳送的大小,一個個排隊傳,一個個確認(我猜的,當然也可以用多緒全狂送,在最後檢查正確性,傳錯或沒收到的包,再通知重傳),所以給最末開發者的工作,就只要做到二端AP的協議還有資料弄成STREAM然後送出跟負責接收的工作就好,其他細部的工作就交給INDY在背景處理囉 當然如果想練功,又沒有開發時程的壓力,或者對INDY元件沒信心,那就自己拿WINSOCK自己慢慢做吧!誰說會開車的人就一定要懂得如何修車,如何組裝一台車?不懂,一樣可以開的很好,一樣可以達到目的地,所以~~請別笑只會用元件寫程式的人.... 我不懂,不懂,不懂....所以我才來 |
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
var Mem: TMemoryStream; {...} Mem := TMemoryStream.Create; Jpeg.SaveToStream(Mem); { now Mem.Memory^ is what you want } {...}下面是另一種方法,用法相同,用途也相同,但在記憶体里佔的空間,僅有一個指標,而不用allocate掉一塊空間來存放這個jpeg var JPGFILE: TFileStream; {...} JPGFILE := TFileStream.Create('c:\abc.jpg',fmOpenRead or fmShareDenyNone); { 這時就可以對JPGFILE操作了,用法跟同樣繼承自TSTREAM的MEMSTREAM差不多 } { 但檔案還是在硬碟里,用指標來讀取,而MEMSTREAM,則是把檔案全讀進記憶体里 } {...}我不懂,不懂,不懂....所以我才來ktop學工夫 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |