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

請教使用ServerSocket元件時如何讓錯誤訊息不出現且運作繼續?

答題得分者是:RaynorPao
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-28 15:28:20 IP:61.220.xxx.xxx 未訂閱
小弟使用ServerSocket撰寫網路檔案傳輸程式的伺服器端,但是一但Client端在檔案傳輸過程中間中斷,則Server這邊就會出現Access Violation的錯誤,且程式也為之中斷,請教要如何使錯誤被跳過(不出現錯誤視窗),且程式能持續進行? 謝謝您!
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-28 15:44:44 IP:203.73.xxx.xxx 未訂閱
引言: 小弟使用ServerSocket撰寫網路檔案傳輸程式的伺服器端,但是一但Client端在檔案傳輸過程中間中斷,則Server這邊就會出現Access Violation的錯誤,且程式也為之中斷,請教要如何使錯誤被跳過(不出現錯誤視窗),且程式能持續進行? 謝謝您!
danielj 你好: 你的程式碼呢?? 是否方便貼上來,幫你看看?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-28 17:08:29 IP:61.220.xxx.xxx 未訂閱
首先感謝RaynorPao的熱心,以下是Server端程式的重點部分,請RaynorPao及眾高手們幫忙看看…    附註: (1)我主要是藉由Server端所收到的文字檔決定是否送出圖片及送出數量,如果在尚未傳送完畢前Client端因故離線或者是發生錯誤,則Server這邊會出現Access Violation的錯誤,原本以為在OnError那邊將ErrorCode設為0就可以了,但是好像沒那麼容易… (2)另外,由於Client端只負責發一次text形式指令給Server,剩下就只有收資料的份,大概不會是Client端的問題,故Client端程式暫不附上…    //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,       TCustomWinSocket *Socket) {     AnsiString command = Socket->ReceiveText();     AnsiString filename;     if      (command=="Command_1")     {         for (int i=0;i<1000;i ) { filename.printf("d",i&); filename=JPEG_PATH filename ".jpg"; SendImage0(filename); } } else if (command=="Command_2") SendImage0("c:\\0000.jpg"); else if (command=="Command_3") SendImage0("c:\\0002.jpg"); } //--------------------------------------------------------------------------- void TForm1::SendImage0(AnsiString image_name) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(image_name); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); Sleep(SLEEP_TIME); } StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { ErrorCode = 0 ; StatusBar1->SimpleText = "Error from Client socket" ; StatusBar1->SimpleText = "Client 端發生錯誤!已中斷與" Socket->RemoteHost "之連線,請重新開啟伺服器" ; for(int i=0; iSocket->ActiveConnections; i ) { if(Socket->RemoteAddress==ServerSocket1->Socket->Connections[i]->RemoteAddress) { ServerSocket1->Socket->Disconnect(i); } } }
RaynorPao
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-28 21:56:39 IP:61.221.xxx.xxx 未訂閱
引言: 首先感謝RaynorPao的熱心,以下是Server端程式的重點部分,請RaynorPao及眾高手們幫忙看看… 附註: (1)我主要是藉由Server端所收到的文字檔決定是否送出圖片及送出數量,如果在尚未傳送完畢前Client端因故離線或者是發生錯誤,則Server這邊會出現Access Violation的錯誤,原本以為在OnError那邊將ErrorCode設為0就可以了,但是好像沒那麼容易… (2)另外,由於Client端只負責發一次text形式指令給Server,剩下就只有收資料的份,大概不會是Client端的問題,故Client端程式暫不附上… //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { AnsiString command = Socket->ReceiveText(); AnsiString filename; if (command=="Command_1") { for (int i=0;i<1000;i ) { filename.printf("d",i&); filename=JPEG_PATH filename ".jpg"; SendImage0(filename); } } else if (command=="Command_2") SendImage0("c:\\0000.jpg"); else if (command=="Command_3") SendImage0("c:\\0002.jpg"); } //--------------------------------------------------------------------------- void TForm1::SendImage0(AnsiString image_name) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(image_name); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); Sleep(SLEEP_TIME); } StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { ErrorCode = 0 ; StatusBar1->SimpleText = "Error from Client socket" ; StatusBar1->SimpleText = "Client 端發生錯誤!已中斷與" Socket->RemoteHost "之連線,請重新開啟伺服器" ; for(int i=0; iSocket->ActiveConnections; i ) { if(Socket->RemoteAddress==ServerSocket1->Socket->Connections[i]->RemoteAddress) { ServerSocket1->Socket->Disconnect(i); } } }
danielj 你好:
小弟我大概已經看過你的程式碼了,應該是參考站內某篇範例改寫而成,因此,
給你一個架構上的建議 (這是我當初一直想更新的版本)
( >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-29 08:52:44 IP:61.220.xxx.xxx 未訂閱
再次感謝RaynorPao大哥的回答,小弟的程式的確是以版上的範例為藍本稍加修改而成,對於您提到的Server端與Client端的訊息溝通部分,我會嘗試看看的,謝謝您!
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-29 10:07:03 IP:61.220.xxx.xxx 未訂閱
小弟依據RaynorPao大哥的建議,修改且加入了一些程式碼,但是似乎沒有如預期的方式運作,能否請RaynorPao大哥及版上高手們再幫忙看一下,到底是那邊有問題呢?再次感謝大家! 附註:ServerSocket1ClientRead只收到過Client端"Command_1"後就再沒有進來過這個副程式了…    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,       TCustomWinSocket *Socket) {     ClientMessage = Socket->ReceiveText();     AnsiString filename;        if      (ClientMessage.SubString(1,15) == "RecievedLength=")     {         if (StrToInt(ClientMessage.SubString(16,ClientMessage.Length())) == LastPacketSize )         {             ClientReceived = true ;         }     }     else if (ClientMessage.SubString(1,7) == "Command")     {         if      (ClientMessage=="Command_1")         {             for (int i=0;i<1000;i ) { filename.printf("d",i&); filename=JPEG_PATH filename ".jpg"; SendImage0(filename); } } else if (ClientMessage=="Command_2") { SendImage0("c:\\0000.jpg"); } else if (ClientMessage=="Command_3") { SendImage0("c:\\0002.jpg"); } } } //--------------------------------------------------------------------------- void TForm1::SendImage0(AnsiString image_name) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(image_name); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); ClientReceived = false ; LastPacketSize = mp.dwThisDataSize ; Timer1->Enabled = true ;//在FormCreat時的Timer->Enabled=false; //在Server端未接獲Client端傳來訊息前暫時停止傳送封包 StatusBar1->SimpleText = "等待Client端回報訊息..." ; while (!ClientReceived)//<==好像都跳不出這個迴圈,我有log Client端送出的text是RecievedLength=1024,應該沒錯 { ; } // Sleep(SLEEP_TIME); } StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = false ; ServerSocket1->Socket->Disconnect(0); }
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-29 11:14:57 IP:218.160.xxx.xxx 未訂閱
while (!ClientReceived)//<==好像都跳不出這個迴圈,我有log Client端送出的text是RecievedLength=1024,應該沒錯 { //加個看看 Application->ProcessMessages(); }
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-29 13:25:13 IP:61.220.xxx.xxx 未訂閱
多謝brook!加了那一行就不會死在那裡了!
系統時間:2024-04-28 12:24:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!