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

用serversocket傳檔的問題

答題得分者是:andychang1690
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-09 23:39:14 IP:211.76.xxx.xxx 未訂閱
我在本機上寫了一個"檔案拷貝"功能的軟体,測過,ok(用fopen) 這陣子要寫一個以serversocket傳送檔案的軟体,也是用fopen,方式一樣, 但是問題來了,只能傳送純文字檔,不能傳送word檔(變亂碼,而且資料量少很多),mp3更慘,傳兩三次(封包次數)後就停了,這是什麼原因呢? 以下是"檔案拷貝"主要的部份. void __fastcall TForm1::Button2Click(TObject *Sender) {         String test;         char *s = StrNew(FilePath.c_str());         SaveDialog1->Execute();         test =ExtractFilePath(SaveDialog1->FileName);         test = test + ExtractFileName(SaveDialog1->FileName);         Edit2->Text = test;         char *ch=StrNew(test.c_str()),line;         FILE *FileTest = fopen(ch,"ab");         FILE *FileTestS = fopen(s,"rb");            while(!feof(FileTestS))         {                 line = getc(FileTestS);                 putc(line,FileTest);         }         fclose(FileTestS);         fclose(FileTest); } 以下是改成網路傳送的主要部份 void TForm1::ClientReceiveText(String Received) {         static FILE *FileTest;         static int x = 0;         Memo1->Lines->Add(Received);         if(!First)         {                 SaveDialog1->FileName = Received;                 SaveDialog1->Execute();                 FilePath =ExtractFilePath(SaveDialog1->FileName) + Received;                 char *ch=StrNew(FilePath.c_str());                 FILE *File = fopen(ch,"a");                 FileTest = File;                 First = true;         }         else         {                 int i;                 char line[50];                    if(Received != "Finish")                 {                         strcpy(line,Received.c_str());                         for(i = 0;iClose(); Close(); } } ClientSocket1->Socket->SendText(IntToStr( x)); } //---------------------------------------------------------------------------- void TForm1::ServerReceiveText(String Received) { static bool SendFinish = false,FileOpened = false,FileClosed = false; static int x = 0; Memo1->Lines->Add(IntToStr( x)); char line[50]; static FILE *FileTest; if(FileOpened == false) { char *ch = StrNew(FilePath.c_str()); FILE *File = fopen(ch,"r"); FileTest = File; FileOpened = true; int i; for(i = 0;i<50;i ) { if(feof(FileTest)) { SendFinish = true; break; } line[i] = getc(FileTest); } ServerSocket1->Socket->Connections[0]->SendText(line); } else { int i; if(SendFinish == true) ServerSocket1->Socket->Connections[0]->SendText("Finish"); else { for(i = 0;i<50;i ) { if(feof(FileTest)) { SendFinish = true; break; } line[i] = getc(FileTest); } ServerSocket1->Socket->Connections[0]->SendText(line); } if(FileClosed == false && SendFinish == true) { FileClosed = true; fclose(FileTest); } } }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-09 23:55:27 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 >
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-10 04:14:34 IP:221.169.xxx.xxx 未訂閱
haman:改用SendBuf()吧!    #define _BUFFERSIZE 8192    if (FileExists(FilePath)) {
  char* Buffer = new char[_BUFFERSIZE 1];      //開啟檔案
  int FileHandle = FileOpen(FilePath, fmOpenRead);
  do {
   int rBytes =
       FileRead(FileHandle, Buffer, _BUFFERSIZE);       if ((rBytes > 0) && ServerSocket1->Socket->Connections[0]->Connected) 
     ServerSocket1->Socket->Connections[0]->SendBuf(Buffer, rBytes);
   else
     break;
  } while (true);
  delete[] Buffer;
  FileClose(FileHandle);
}
Andy Chang
------
Andy Chang
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-10 18:47:04 IP:211.76.xxx.xxx 未訂閱
哦哦..原來程式碼可以這樣po哦,感謝taishyang大大 下面是"檔案拷貝"的主要片段
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        String test;
        char *s = StrNew(FilePath.c_str());
        SaveDialog1->Execute();
        test =ExtractFilePath(SaveDialog1->FileName);
        test = test   ExtractFileName(SaveDialog1->FileName);
        Edit2->Text = test;
        char *ch=StrNew(test.c_str()),line;
        FILE *FileTest = fopen(ch,"ab");
        FILE *FileTestS = fopen(s,"rb");            while(!feof(FileTestS))
        {
                line = getc(FileTestS);
                putc(line,FileTest);
        }
        fclose(FileTestS);
        fclose(FileTest);
}
下面這個是改成網路的
    void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
        Memo1->Lines->Add("連線發生錯誤");
}
//---------------------------------------------------------------------------    void TForm1::ClientReceiveText(String Received)
{
        static FILE *FileTest;
        static int x = 0;
        Memo1->Lines->Add(Received);
        if(!First)
        {
                SaveDialog1->FileName = Received;
                SaveDialog1->Execute();
                FilePath =ExtractFilePath(SaveDialog1->FileName)   Received;
                char *ch=StrNew(FilePath.c_str());
                FILE *File = fopen(ch,"a");
                FileTest = File;
                First = true;
        }
        else
        {
                int i;
                char line[50];                    if(Received != "Finish")
                {
                        strcpy(line,Received.c_str());
                        for(i = 0;iClose();
                        Close();
                }
        }
        ClientSocket1->Socket->SendText(IntToStr(  x));
}
//----------------------------------------------------------------------------
void TForm1::ServerReceiveText(String Received)
{
        static bool SendFinish = false,FileOpened = false,FileClosed = false;
        static int x = 0;
        Memo1->Lines->Add(IntToStr(  x));
        char line[50];
        static FILE *FileTest;
        if(FileOpened == false)
        {
                char *ch = StrNew(FilePath.c_str());
                FILE *File = fopen(ch,"r");
                FileTest = File;
                FileOpened = true;
                int i;
                for(i = 0;i<50;i  )
                {
                        if(feof(FileTest))
                        {
                                SendFinish = true;
                                break;
                        }
                        line[i] = getc(FileTest);
                }
                ServerSocket1->Socket->Connections[0]->SendText(line);
        }
        else
        {
                int i;
                if(SendFinish == true)
                        ServerSocket1->Socket->Connections[0]->SendText("Finish");
                else
                {
                        for(i = 0;i<50;i  )
                        {
                                if(feof(FileTest))
                                {
                                        SendFinish = true;
                                        break;
                                }
                                line[i] = getc(FileTest);
                        }
                        ServerSocket1->Socket->Connections[0]->SendText(line);
                }
                if(FileClosed == false && SendFinish == true)
                {
                        FileClosed = true;
                        fclose(FileTest);
                }
        }
}
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-14 22:07:40 IP:211.76.xxx.xxx 未訂閱
呵呵,感謝Andy大大的幫忙,這個問題大部份已經解決了,只剩下一點怪怪的小問題,如果我解決不了再上來麻煩Andy大大吧^^"    現在就把我修改過的副程式po上來吧^^
void TForm1::ClientReceiveText(char* Received)
{
        static FILE *FileTest;
        static int x = 0,FileSize;
    //    Memo1->Lines->Add(Received);
        if(!First)
        {
                String ReceiveTmp = Received;
                SaveDialog1->FileName = ReceiveTmp.SubString(1,ReceiveTmp.Pos(":")-1);
                String test = ReceiveTmp.SubString(ReceiveTmp.Pos(":") 1,ReceiveTmp.Length());
//                test = test.SubString(1,test.Pos("u")-1);
                FileSize =  StrToInt(test);
                Memo1->Lines->Add("File size is :"   IntToStr(FileSize));
                SaveDialog1->Execute();
                FilePath =ExtractFilePath(SaveDialog1->FileName)   ReceiveTmp.SubString(1,ReceiveTmp.Pos(":")-1);
                char *ch=StrNew(FilePath.c_str());
                FILE *File = fopen(ch,"ab");
                FileTest = File;
                First = true;
        }
        else
        {
                int i;
                if(strcmp(Received,"Finish"))
                {
                         for(i = 0;i<_BUFFERSIZE;i  )
                                putc(*(Received   i),FileTest);
                }
                else
                {
                        fclose(FileTest);
                        ClientSocket1->Close();
                        Memo1->Lines->Add("接收完成");
                }
        }
        ClientSocket1->Socket->SendText(IntToStr(  x));
}
//----------------------------------------------------------------------------
void TForm1::ServerReceiveText(String Received)
{
        static bool SendFinish = false,FileOpened = false,FileClosed = false;
        static int x = 0;
        Memo1->Lines->Add(IntToStr(  x));
        char* Buffer = new char[_BUFFERSIZE];
        static FILE *FileTest;
        if(FileOpened == false)
        {
                char *ch = StrNew(FilePath.c_str());
                FILE *File = fopen(ch,"rb");
                FileTest = File;
                FileOpened = true;
                int i;
                for(i = 0;i<_BUFFERSIZE;i  )
                {
                        if(feof(FileTest))
                        {
                                SendFinish = true;
                                break;
                        }
                        *(Buffer  i) = getc(FileTest);
                }
                ServerSocket1->Socket->Connections[0]->SendBuf(Buffer,_BUFFERSIZE);
        }
        else
        {
                int i;
                if(SendFinish == true)
                {
                        FileClosed = true;
                        fclose(FileTest);
                        ServerSocket1->Socket->Connections[0]->SendText("Finish");
                        ServerSocket1->Close();
                }
                else
                {
                        for(i = 0;i<_BUFFERSIZE;i  )
                        {
                                if(feof(FileTest))
                                {
                                        SendFinish = true;
                                        break;
                                }
                                *(Buffer  i) = getc(FileTest);
                        }
                         ServerSocket1->Socket->Connections[0]->SendBuf(Buffer,_BUFFERSIZE);
                }
        }
}    
系統時間:2024-04-20 11:36:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!