請問有關ClientSocketRead的問題?? |
答題得分者是:RaynorPao
|
shing187
一般會員 發表:45 回覆:63 積分:21 註冊:2003-01-15 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 目前我的程式有三個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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 為何會跳離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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 使用MemoryStream 在ClientSocketRead的時候 是否會佔去系統大部分的資源?? 如果會??該怎麼改善呢??shing187 你好: 我的經驗 TMemoryStream 是不會佔去系統很多資源的,除非你 create 了一個 超大塊的記憶體才會吧,我曾經 create size=30mb 的 TMemoryStream,但是 並不會對整個系統的效能造成影響的 --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
shing187
一般會員 發表:45 回覆:63 積分:21 註冊:2003-01-15 發送簡訊給我 |
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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 還有一個問題.... 如果我將 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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 可是我存下來的jpeg檔案都可以正常的執行耶... 現在的問題感覺是程式在背景執行的感覺....shing187 你好: 我聽不懂你的問題< > 或許你可以貼個圖上來解釋一番??< > http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7332 -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
shing187
一般會員 發表:45 回覆:63 積分:21 註冊:2003-01-15 發送簡訊給我 |
RaynorPao你好...
我把我的問題在說明清楚一下好了...
1.我目前程式跟server溝通看起來大致沒問題...但是如果
在ClientSocketRead不做Sleep的話,很容易掛掉,不知道
是哪邊出了問題??跟傳輸的速度有關係嗎??
不知道問題該怎麼改善??
2.我的程式在開始執行之後,開始做jpeg存檔的動作,但是在
畫面看不到程式在做動作的感覺,我在程式中有做Counter,
Counter都沒有累加,直到程式跳離ClientSocketRead後,才
能看到Counter的數字,我想將jpeg直接從TImage秀出來,應
該跟Counter的問題應該相同吧!這是什麼原因呢??請指教!
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
shing187
一般會員 發表:45 回覆:63 積分:21 註冊:2003-01-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |