全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2050
推到 Plurk!
推到 Facebook!

請問有關ClientSocketRead的問題??

答題得分者是:RaynorPao
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-18 14:40:25 IP:211.78.xxx.xxx 未訂閱
目前我的程式有三個Command包括Login,RequestData,StopData 在RequestData執行後,ClientSocketRead會得到由Server送過來的Data, 但是,如果Data的Header發生錯誤,我想要先執行StopData停止Data傳送, 然後重新做RequestData的動作,請問該如何下手呢??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-18 16:00:59 IP:203.73.xxx.xxx 未訂閱
引言: 目前我的程式有三個Command包括Login,RequestData,StopData 在RequestData執行後,ClientSocketRead會得到由Server送過來的Data, 但是,如果Data的Header發生錯誤,我想要先執行StopData停止Data傳送, 然後重新做RequestData的動作,請問該如何下手呢??
shing187 你好: 立即停止的做法~~會有時間上的差異、網路的變數、封包的大小...應該比較難 達成;你可以嘗試用回報的方式來做~~可能會比較容易,例如: 假如 server 端 總共送出 100 個封包給 client 的話,同時你的 client 端必須先 check 封包 是否正確,然後回報給 server,等到 server 端將 100 個封包都送出以後,再 回頭 check 陸續來自 client 端的回報,以便知道哪一個封包必須重送 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-19 10:42:53 IP:211.78.xxx.xxx 未訂閱
為何會跳離ClientSocketRead呢?? 在ClientSocketRead有幾個if...else 簡單描述如下 if(A) { block A;} else { if(B) { block B;} else { block C;} { 但是程式卻無法跳入第二層的if...else中 請問有什麼見解嗎??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-19 11:00:37 IP:203.73.xxx.xxx 未訂閱
引言: 為何會跳離ClientSocketRead呢?? 在ClientSocketRead有幾個if...else 簡單描述如下 if(A) { block A;} else { if(B) { block B;} else { block C;} { 但是程式卻無法跳入第二層的if...else中 請問有什麼見解嗎??
shing187 你好: 我的經驗是~~每個封包的大小不可以設太大(最好不要超過 1.5k) 如果封包太大的話,第一或第二個封包丟完以後, > --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-20 16:03:23 IP:211.78.xxx.xxx 未訂閱
使用MemoryStream 在ClientSocketRead的時候 是否會佔去系統大部分的資源?? 如果會??該怎麼改善呢??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-20 16:18:29 IP:203.73.xxx.xxx 未訂閱
引言: 使用MemoryStream 在ClientSocketRead的時候 是否會佔去系統大部分的資源?? 如果會??該怎麼改善呢??
shing187 你好: 我的經驗 TMemoryStream 是不會佔去系統很多資源的,除非你 create 了一個 超大塊的記憶體才會吧,我曾經 create size=30mb 的 TMemoryStream,但是 並不會對整個系統的效能造成影響的 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-20 16:35:49 IP:211.78.xxx.xxx 未訂閱
RaynorPao你好.... 我ClientSocket1Read的程式大致如下... #define ReadSize 2048 TMemoryStream *msBuf; void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { reStart: if(msBufsize == 0) { msBuf=new TMemoryStream; PACKETSTREAM pstrm; ClientSocket1->Socket->ReceiveBuf(&pstrm, 60); structsize = (pstrm.dwstructsize) - 60; AnsiString PackID=(AnsiString)pstrm.identification; if(PackID.SubString(1, 6)=="Header") { BYTE *Buf = new BYTE[ReadSize]; ClientSocket1->Socket->ReceiveBuf(Buf, ReadSize); if((Buf[0] == 0xFF) && (Buf[1] == 0xFF)) msBuf->WriteBuffer(Buf 1, ReadSize-1); else if((Buf[0] == 0xFF) && (Buf[1] == 0xD8)) msBuf->WriteBuffer(Buf, ReadSize); else if((Buf[170] == 0x00) && (Buf[171] == 0x00)) { Abort(); } else { searchHeader(); delete msBuf; goto reStart; } msBufsize =ReadSize; delete[] Buf; } else { searchHeader(); delete msBuf; goto reStart; } } else { BYTE *Buf = new BYTE[size]; ClientSocket1->Socket->ReceiveBuf(Buf, size); msBuf->WriteBuffer(Buf, size); msBufsize =size; } structsize-=ReadSize; if(structsize <= (int)ReadSize) size = structsize; else size = (int)ReadSize; if(structsize <= 0) { i ; msBuf->Position = 0; TJPEGImage *jpeg = new TJPEGImage; jpeg->LoadFromStream(msBuf); Image1->Picture->Assign(jpeg); delete jpeg; msBufsize = 0; delete msBuf; } } 為何沒有辦法將抓到的jpeg檔案馬上秀在程式中呢?? 是哪邊出了問題呢?? 發表人 - shing187 於 2003/02/20 16:40:03
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-20 18:26:28 IP:211.78.xxx.xxx 未訂閱
還有一個問題.... 如果我將 TJPEGImage *jpeg = new TJPEGImage; jpeg->LoadFromStream(msBuf); Image1->Picture->Assign(jpeg); delete jpeg; 改成 AnsiString tmp = IntToStr(i); msBuf->SaveToFile("C:\\test\\" tmp ".jpg"); 將所得到的jpeg存檔 無法回到程式的執行畫面?? 為什麼??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-21 10:52:26 IP:203.73.xxx.xxx 未訂閱
引言: 還有一個問題.... 如果我將 TJPEGImage *jpeg = new TJPEGImage; jpeg->LoadFromStream(msBuf); Image1->Picture->Assign(jpeg); delete jpeg; 改成 AnsiString tmp = IntToStr(i); msBuf->SaveToFile("C:\\test\\" tmp ".jpg"); 將所得到的jpeg存檔 無法回到程式的執行畫面?? 為什麼??
shing187 你好: 我想最有可能的問題 是出在你所收到資料的頭檔(jpg)不正確 才會導致無法顯示 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-21 11:04:31 IP:211.78.xxx.xxx 未訂閱
我想最有可能的問題 是出在你所收到資料的頭檔(jpg)不正確 才會導致無法顯示 可是我存下來的jpeg檔案都可以正常的執行耶... 現在的問題感覺是程式在背景執行的感覺....
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-21 11:26:15 IP:203.73.xxx.xxx 未訂閱
引言: 可是我存下來的jpeg檔案都可以正常的執行耶... 現在的問題感覺是程式在背景執行的感覺....
shing187 你好: 我聽不懂你的問題< > 或許你可以貼個圖上來解釋一番??< > http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7332 -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-02-21 11:52:50 IP:211.78.xxx.xxx 未訂閱
RaynorPao你好... 我把我的問題在說明清楚一下好了... 1.我目前程式跟server溝通看起來大致沒問題...但是如果 在ClientSocketRead不做Sleep的話,很容易掛掉,不知道 是哪邊出了問題??跟傳輸的速度有關係嗎?? 不知道問題該怎麼改善?? 2.我的程式在開始執行之後,開始做jpeg存檔的動作,但是在 畫面看不到程式在做動作的感覺,我在程式中有做Counter, Counter都沒有累加,直到程式跳離ClientSocketRead後,才 能看到Counter的數字,我想將jpeg直接從TImage秀出來,應 該跟Counter的問題應該相同吧!這是什麼原因呢??請指教!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-02-21 12:35:45 IP:203.73.xxx.xxx 未訂閱
引言: RaynorPao你好... 我把我的問題在說明清楚一下好了... 1.我目前程式跟server溝通看起來大致沒問題...但是如果 在ClientSocketRead不做Sleep的話,很容易掛掉,不知道 是哪邊出了問題??跟傳輸的速度有關係嗎?? 不知道問題該怎麼改善?? 2.我的程式在開始執行之後,開始做jpeg存檔的動作,但是在 畫面看不到程式在做動作的感覺,我在程式中有做Counter, Counter都沒有累加,直到程式跳離ClientSocketRead後,才 能看到Counter的數字,我想將jpeg直接從TImage秀出來,應 該跟Counter的問題應該相同吧!這是什麼原因呢??請指教!
shing187 你好
(1)因為不知道 server 端是怎麼設計的?? 所以,這個問題我也只能做猜測了,
   server 端每傳送一個封包,最好 sleep 一小段時間(純粹經驗談)
(2)這個問題,跟以下連結中的問題是一樣的
    >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-02-21 14:27:47 IP:211.78.xxx.xxx 未訂閱
RaynorPao你好.... 在client端做一個 Timer1,以固定週期的時間去LoadFromStream, 然後再把內容 show 在 Image1 上面,這個做法我有想過... 但是,我無法知道我是否抓取到完整的jpeg檔案,那LoadFromStream 的時候應該會出現錯誤吧....不是嗎?? 還是能用什麼方法克服呢??
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-02-21 14:35:51 IP:203.73.xxx.xxx 未訂閱
引言: RaynorPao你好.... 在client端做一個 Timer1,以固定週期的時間去LoadFromStream, 然後再把內容 show 在 Image1 上面,這個做法我有想過... 但是,我無法知道我是否抓取到完整的jpeg檔案,那LoadFromStream 的時候應該會出現錯誤吧....不是嗎?? 還是能用什麼方法克服呢??
shing187 你好: 這個問題可以用兩個 TMemoryStream 來克服 一個前景、一個背景(msFront, msBack) 從 ClientSocket 每次收到的資料都先寫入 msBack 等到 msBack 收集到完整的一張 jpg 以後 把 msBack 內的資料,複製到 msFront 而在 Timer1 中固定 Load msFront 的資料 送到 Image1 去顯示 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-02-21 17:33:03 IP:211.78.xxx.xxx 未訂閱
如果我想把ClientSocketRead的動作放到Thread中 該怎麼寫才正確呀?? 發表人 - shing187 於 2003/02/21 17:58:49
shing187
一般會員


發表:45
回覆:63
積分:21
註冊:2003-01-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-02-25 13:47:03 IP:211.78.xxx.xxx 未訂閱
1.如果要顯示圖片的時候,做Application->ProcessMessages() 可以馬上把圖片顯示出來嗎??該怎麼寫會比較正確?? 2.不然,如果我用Thread的方式做處理,該怎麼寫才對呀?? 我把ClientSocketRead放到Thread之中,但是開始執行後, ClientSocketRead還是佔據了整個CPU時間的感覺,不知道 哪邊寫錯了??
系統時間:2024-03-28 22:16:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!