線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6254
推到 Plurk!
推到 Facebook!

server client 端互傳檔案

答題得分者是:cashyy
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-02 14:41:07 IP:218.168.xxx.xxx 未訂閱
我按照站上http://delphi.ktop.com.tw/topic.php?topic_id=25913,http://delphi.ktop.com.tw/topic.php?topic_id=25912的兩個範例,嘗試用bcb5來作,有些問題想請教各位大大 Question: 在server 端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"list index out of bounds(0) " 在client端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-02 14:50:46 IP:218.168.xxx.xxx 未訂閱
我把code貼出來方便大大觀看
//----server 端
#include 
#pragma hdrstop    #include "Unit1.h"
TMemoryStream *gmsFile=NULL;    //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   ServerSocket1->Port=4000;
   ServerSocket1->Open();
   gmsFile=new TMemoryStream;
}
__fastcall TForm1::~TForm1()
{
   if(gmsFile) delete gmsFile;
   ServerSocket1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TMemoryStream *msFile=new TMemoryStream;
   msFile->LoadFromFile("hand(s2c).jpg");
   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(10);
   }
   delete msFile;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
   MYPACK mp;
   Socket->ReceiveBuf(&mp, sizeof(MYPACK));       AnsiString sz=(AnsiString)mp.szHeader;
   if(sz.SubString(1, 4)=="FILE")
   {
      if(sz=="FILE-START")
      {
         gmsFile->Size=mp.dwTotalDataSize;
         gmsFile->Position=0;
      }
      gmsFile->Write(mp.pbThisData, mp.dwThisDataSize);
      if(sz=="FILE-END")
      {
         gmsFile->Position=0;
         gmsFile->SaveToFile(mp.szFileName);
         gmsFile->Clear();
      }
   }
}
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-02 14:54:07 IP:218.168.xxx.xxx 未訂閱
//------client 端
#include 
#pragma hdrstop
#include "Unit1.h"
TMemoryStream *gmsFile=NULL;
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   ClientSocket1->Address="127.0.0.1";
   ClientSocket1->Port=4000;
   ClientSocket1->Open();
   gmsFile=new TMemoryStream;
}
__fastcall TForm1::~TForm1()
{
   if(gmsFile) delete gmsFile;
   ClientSocket1->Close();
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TMemoryStream *msFile=new TMemoryStream;
   msFile->LoadFromFile("hand(c2s).jpg");
   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);          ClientSocket1->Socket->SendBuf(&mp, sizeof(MYPACK));
      Sleep(10);
   }
   delete msFile;
}
//-------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
   MYPACK mp;
   Socket->ReceiveBuf(&mp, sizeof(MYPACK));       AnsiString sz=(AnsiString)mp.szHeader;
   if(sz.SubString(1, 4)=="FILE")
   {
      if(sz=="FILE-START")
      {
         gmsFile->Size=mp.dwTotalDataSize;
         gmsFile->Position=0;
      }
      gmsFile->Write(mp.pbThisData, mp.dwThisDataSize);
      if(sz=="FILE-END")
      {
         gmsFile->Position=0;
         gmsFile->SaveToFile(mp.szFileName);
         gmsFile->Clear();
      }
   }
} 
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-03 18:24:27 IP:59.104.xxx.xxx 未訂閱
引言: 我按照站上http://delphi.ktop.com.tw/topic.php?topic_id=25913,http://delphi.ktop.com.tw/topic.php?topic_id=25912的兩個範例,嘗試用bcb5來作,有些問題想請教各位大大 Question: 在server 端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"list index out of bounds(0) " 在client端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意
您好! 1.Button1Click的動作:傳送封包到接收端! 2.ServerSocketClientRead的動作:收到傳送端的封包時,所做的判斷與處理! 3."FILE-START","FILE-END","FILE-CONTINUE"的函意:這意思是說,當我傳送第一個封包時,設定為"FILE-START"字串,然後傳送封包!在接收端收到之後,就可以用這個字串("FILE-START")來判斷是那一個封包! 例如: 傳送端,送出一個1。 接收端,收到一個1。 那接收端就知到這是第一個封包! 您也可以自己定義:如:a,b,c,當接收端收到a時要做什麼?,當收到b時要做什麼?............. ========================================================= 小弟重新舉例: 小弟將FILE-START","FILE-END","FILE-CONTINUE"這三個轉成中文,然後再解釋一次。 "FILE-START" =>第一個封包 "FILE-END" =>最後一個封包 "FILE-CONTINUE" =>中間的封包
  if(接收第一個封包)
  {
    //接收第一個封包的處理
  }
  else
    if(接收中間的封包)
    {
      //接收中間封包的處理
    }
    else  //(接收最後的封包)
    {
      //接收最後封包的處理
    }
FILE-START","FILE-END","FILE-CONTINUE" =>的意思就是要用來判斷是"第一個封包",還是"中間的封包",還是"最後一個封包" 發表人 - cashyy 於 2005/08/03 18:42:59
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-03 23:49:19 IP:218.168.xxx.xxx 未訂閱
感謝cashyy大大的解釋 讓我更了解程式的寫法了 繼續拜讀ing ^__^
cimgg
一般會員


發表:21
回覆:30
積分:10
註冊:2005-05-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-04 18:00:32 IP:222.76.xxx.xxx 未訂閱
引言: 我按照站上http://delphi.ktop.com.tw/topic.php?topic_id=25913,http://delphi.ktop.com.tw/topic.php?topic_id=25912的兩個範例,嘗試用bcb5來作,有些問題想請教各位大大 Question: 在server 端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"list index out of bounds(0) " 在client端 1.Button1Click以及ServerSocket1ClientRead這兩部分作了什麼動作呢? 其中 "FILE-START","FILE-END","FILE-CONTINUE"有什麼函意嗎? 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意
我在電腦中運行這兩個程式也會出現這樣的錯誤,不曉得是什麽問題,有人可以回答嗎 授人玫瑰,手有余香
JAPTION
一般會員


發表:1
回覆:7
積分:1
註冊:2003-12-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-11 11:28:40 IP:210.243.xxx.xxx 未訂閱
在client端 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意 就我所知這是因為你的SOCKET斷線了,但是卻還一直在傳送資料,所以你應該加一個判斷斷線時的處理。
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-12 08:49:47 IP:61.217.xxx.xxx 未訂閱
引言: 在client端 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意 就我所知這是因為你的SOCKET斷線了,但是卻還一直在傳送資料,所以你應該加一個判斷斷線時的處理。
好像不是斷線問題,測試了一下,程式會跑到clientsocketerror然後停止了 並不會跑到clientsocketdisconnect這個地方 在程式中還有一些地方不懂想請問前輩們^^" Q1: 程式中下列這段
 #define MAX_STRLEN 16
#define MAX_DATASIZE 1024
typedef struct _MyPack
{
   char szHeader[MAX_STRLEN];
   char szFileName[MAX_STRLEN];
   DWORD dwPackTotal;
   DWORD dwPackCount;
   DWORD dwTotalDataSize;
   DWORD dwThisDataSize;
   BYTE pbThisData[MAX_DATASIZE];
} MYPACK;
這是不是所謂的封包,一定要定義這些才能傳送檔案嗎? 這種定義是制式的嗎? Q2:下面兩段程式定義差別是? 1. gmsFile=new TMemoryStream; 2. TMemoryStream *msFile=new TMemoryStream;
JAPTION
一般會員


發表:1
回覆:7
積分:1
註冊:2003-12-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-12 09:15:32 IP:203.73.xxx.xxx 未訂閱
引言:
引言: 在client端 2.執行程式會發生"Asynchronous socket error 10061" 第一次接觸網路程式,有很多地方不懂,所以想請大大們解惑^^" 祝:如意 就我所知這是因為你的SOCKET斷線了,但是卻還一直在傳送資料,所以你應該加一個判斷斷線時的處理。
好像不是斷線問題,測試了一下,程式會跑到clientsocketerror然後停止了 並不會跑到clientsocketdisconnect這個地方 在程式中還有一些地方不懂想請問前輩們^^" Q1: 程式中下列這段
 #define MAX_STRLEN 16
#define MAX_DATASIZE 1024
typedef struct _MyPack
{
   char szHeader[MAX_STRLEN];
   char szFileName[MAX_STRLEN];
   DWORD dwPackTotal;
   DWORD dwPackCount;
   DWORD dwTotalDataSize;
   DWORD dwThisDataSize;
   BYTE pbThisData[MAX_DATASIZE];
} MYPACK;
這是不是所謂的封包,一定要定義這些才能傳送檔案嗎? 這種定義是制式的嗎? Q2:下面兩段程式定義差別是? 1. gmsFile=new TMemoryStream; 2. TMemoryStream *msFile=new TMemoryStream;
其實我之前也常發生這樣的狀況,你可以檢查一下是不是有那個地方你把socket server關掉了,但是client卻還在繼續傳,我看到網上有人在clientsocketerror 將errorcode = 0;好像可以讓這個訊息不出現,但是並不能真正解決這個問題,但如果你將errorcode = 0;後再重建socket看看是不是可行。 還有你試一下在clientsocketdisconnect、clientsocketerror、clientsocketconnect都做一個出輸訊息就可以知道是不是斷線了。 MYPACK只是定義要互傳檔案的資料內容而己,其實並不是那麼須要的。
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-17 18:37:07 IP:218.168.xxx.xxx 未訂閱
引言: 其實我之前也常發生這樣的狀況,你可以檢查一下是不是有那個地方你把socket server關掉了,但是client卻還在繼續傳,我看到網上有人在clientsocketerror 將errorcode = 0;好像可以讓這個訊息不出現,但是並不能真正解決這個問題,但如果你將errorcode = 0;後再重建socket看看是不是可行。 還有你試一下在clientsocketdisconnect、clientsocketerror、clientsocketconnect都做一個出輸訊息就可以知道是不是斷線了。 MYPACK只定義要互傳檔案的資料內容而己,其實並不是那麼須要的。
意思是說MYPACK可以刪掉囉,如果刪掉的話,那 ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)) 這個地方要如何改寫才可以達到傳檔的功能?
haman
中階會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-24 00:25:59 IP:211.76.xxx.xxx 未訂閱
引言: 意思是說MYPACK可以刪掉囉,如果刪掉的話,那 ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)) 這個地方要如何改寫才可以達到傳檔的功能?
傳檔的話就我所知是不能用sendstring的,收檔會有問題(char *跟string之間的問題) 不一定要用mypake這個strcut啦 下面有我之前寫的傳檔,裡面就沒有用到struct,你可以參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=77282 另外,我有遇到一個錯誤訊息"Asynchronous socket error 10053" 是在我server client連線建立後傳第一個封包的時後出現的(client -> server), 用seniffer看client端跟本沒送出封包,防火牆也沒開 這..是什麼情況丫??>"<
JAPTION
一般會員


發表:1
回覆:7
積分:1
註冊:2003-12-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-24 08:51:03 IP:210.243.xxx.xxx 未訂閱
引言:
引言: 意思是說MYPACK可以刪掉囉,如果刪掉的話,那 ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)) 這個地方要如何改寫才可以達到傳檔的功能?
傳檔的話就我所知是不能用sendstring的,收檔會有問題(char *跟string之間的問題) 不一定要用mypake這個strcut啦 下面有我之前寫的傳檔,裡面就沒有用到struct,你可以參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=77282 另外,我有遇到一個錯誤訊息"Asynchronous socket error 10053" 是在我server client連線建立後傳第一個封包的時後出現的(client -> server), 用seniffer看client端跟本沒送出封包,防火牆也沒開 這..是什麼情況丫??>"<
http://delphi.ktop.com.tw/topic.php?topic_id=30956 你可以看看大大們整理出來的error說明哦!
japplet2001
一般會員


發表:2
回覆:1
積分:0
註冊:2005-09-14

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-16 15:27:36 IP:192.192.xxx.xxx 未訂閱
想再請問一下如果我要傳檔到ip中的port內的某個目錄中 請問該要如何設定ㄋ? ClientSocket1->Address="172.0.0.1"; ClientSocket1->Port=6800; ClientSocket1->Open();
wasisrk
一般會員


發表:6
回覆:9
積分:3
註冊:2005-03-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-17 17:06:20 IP:218.168.xxx.xxx 未訂閱
感謝大大們的熱心指教^^ 依規定些問是必需結案了所以 japplet2001 你的問題可能需要另開一個來討論 你的問題也是我沒有想到的問題^^"
系統時間:2024-04-20 11:07:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!