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

IdTCPConnect ReadStream有問題

缺席
parais
一般會員


發表:15
回覆:11
積分:5
註冊:2002-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-18 16:17:18 IP:203.70.xxx.xxx 未訂閱
有二個程式server & client  client傳檔案給server,在client傳時先WriteLn("stream"),再WriteStream,而server在ReadLn=="stream"後再ReadStream 問題來了,.. 1.不知server為何ReadStream後就不會執行下一行(等很久或斷線才會) 2.indy有很多read,write方法,不知其詳細正當時機用法,看了很多文章,也越來越亂,所以想請高人指點一下...    server:(紅色為問題點)
void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
   try{
        AnsiString sy=AThread->Connection->Socket->Binding->PeerIP;
        AnsiString sz=AThread->Connection->ReadLn(LF,-2,-1);
        Memo1->Lines->Add(sy "received:" sz);
        if(sz=="stream")
            sendflag=true;
        else
            sendflag=false;
        if(sendflag)
        {                TMemoryStream *RDStream=new TMemoryStream();
            AnsiString a("");
       AThread->Connection->ReadStream(RDStream,-1,false);
            RDStream->Read(a.c_str(), RDStream->Size);
            Memo1->Text=a;
            delete RDStream;
            sendflag=false;
        }
    }catch{
        sendflag=false;
    }    }    client(比較沒問題,有用別的設備收過,正確)    void __fastcall TForm1::Button3Click(TObject *Sender)
{
    try{
        Button3->Enabled=false;
        Button4->Enabled=false;
        if(IdTCPClient1->Connected())
            if(OpenDialog1->Execute())
            {
                TMemoryStream *TMS=new TMemoryStream();
                TMS->LoadFromFile(OpenDialog1->FileName);
                TMS->Position=0;
                try{
                    IdTCPClient1->WriteLn("stream");
                }catch(...){
                    if(ConnectFlag)
                        Timer1->Enabled=true;//重新連線的timer
                    return;
                }
                int tmplen=TMS->Size,sendtimes=0,fixlen=8000;
                sendtimes=tmplen/8000;
                do{
                    if(sendtimes==0)//切成8k
                    {
                        TMemoryStream *sd=new TMemoryStream();
                        sd->CopyFrom(TMS,TMS->Size - TMS->Position);
                        IdTCPClient1->WriteStream(sd,true,false,sd->Size-sd->Position);
                        sendtimes=-1;
                        delete sd;                        }
                    else if(sendtimes>0)
                    {
                        TMemoryStream *sd=new TMemoryStream();
                        sd->CopyFrom(TMS,fixlen);
                        IdTCPClient1->WriteStream(sd,true,false,fixlen);                        
                        delete sd;
                                           }
                }while(!sendtimes);
                delete TMS;
            }
            else
                if(ConnectFlag)
                    Timer1->Enabled=true;
    }catch(...){
        if(ConnectFlag)
            Timer1->Enabled=true;
    }
   }
謝謝大家的指教 謝謝您花費寶貴時間回應!!
------
**********************


**********************
louive
一般會員


發表:3
回覆:2
積分:1
註冊:2004-11-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-29 09:46:27 IP:61.144.xxx.xxx 未訂閱
readStream and writeStream 有一个参数传递文件直到连接断掉才会执行的呀!好好看看这两个function吧
ChangRicky
一般會員


發表:0
回覆:6
積分:6
註冊:2004-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-14 02:33:27 IP:220.228.xxx.xxx 未訂閱
如果 第三個參數設為 FALSE 則 INDY 會將前四個BYTE當成長度等候接收!!
系統時間:2024-03-29 17:51:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!