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

急問~~~NMUDP接收問題

答題得分者是:00156
Elsa-fen
一般會員


發表:9
回覆:16
積分:5
註冊:2003-09-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-13 22:51:38 IP:210.66.xxx.xxx 未訂閱
不好意思...我現在有a,b 2台電腦同時要回傳資料給c.... 但...若a正傳送檔案給c的同時...b也要傳進來給c..程式就會出現問題.. (我只用一個nmudp的元件) 請問..這部份的問題有人遇過嗎...and..要如何解決呢..謝謝
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-15 21:38:21 IP:61.56.xxx.xxx 未訂閱
引言: 不好意思...我現在有a,b 2台電腦同時要回傳資料給c.... 但...若a正傳送檔案給c的同時...b也要傳進來給c..程式就會出現問題.. (我只用一個nmudp的元件) 請問..這部份的問題有人遇過嗎...and..要如何解決呢..謝謝
我以前的解決方法是在c宣告一個變數來記錄是否正在傳送中,當接收到傳送的request時,若處於idle狀態,即回覆"許可"的訊號,開始進行傳送,否則回覆"傳送中"的訊號,要求對方先等待,等候一定時間再重新request 不知道這個方法是否可行?
Elsa-fen
一般會員


發表:9
回覆:16
積分:5
註冊:2003-09-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-15 23:13:50 IP:210.64.xxx.xxx 未訂閱
引言: 我以前的解決方法是在c宣告一個變數來記錄是否正在傳送中,當接收到傳送的request時,若處於idle狀態,即回覆"許可"的訊號,開始進行傳送,否則回覆"傳送中"的訊號,要求對方先等待,等候一定時間再重新request 不知道這個方法是否可行?
我的想法也是這樣..但..不知道在delphi內要怎麼做呢..不知道有沒有人做過這方面的處理呢...<不好意思..我還是新手呢..> 不好意思..再問個問題... http://delphi.ktop.com.tw/topic.php?topic_id=26382 這篇文章中所提到的.. NMUDP2來接收, NMUDP1 的Remoteport=4001 NMUDP2 的Remoteport=4002 NMUDP1 的LocalPort=4002 NMUDP2 的LocalPort=4001 接收 NMUDP2.ReadBuffer(ReciBuf,NumberBytes); .... 是什麼意思呢..有人知道嗎?/謝謝 發表人 - elsa-fen 於 2004/03/15 23:35:04
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-16 17:46:58 IP:61.56.xxx.xxx 未訂閱
提供一段code供您參考: (這個程式角色和妳的相反...這是server端的程式,用來傳送檔案給client端下載的。  當接收到client端的request是"#list..."時,回傳可以下載的檔案清單;  當接收到的request是"#get..."時,開始回傳許可或拒絕的訊息給client端;  當request是"#next",表是繼續傳送目前正在下載的檔案。 )    
type
  TForm1=class(TForm)
    udp: TIdUDPClient;
    udps: TIdUDPServer;
    tasklist: TListBox; //記錄Server端註冊可供下載的檔案清單
    ...省略...
    procedure udpsUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
    procedure TForm1.FormCreate(Sender: TObject);
  private
    f:file;
    FFileOpen:boolean; //記錄是否有檔案正在傳送
  end;    procedure TForm1.udpsUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var buffer:array[0..511] of char;
    cmd:string;
    SourceFileName:TFileName;
    NumRead:integer;
begin      //取得client端的request資訊
  AData.Position:=0;
  AData.ReadBuffer(buffer,AData.Size);
  cmd:=StrPas(buffer);
  SetLength(cmd,AData.Size);      //解析request資訊
  udp.Host:=Copy(cmd,7,15); {request裡的第7~21字元儲存client端的IP位置}
  if Pos('#list',cmd)=1 then
    begin
      try
        udp.Send(tasklist.Items.Text);
      except
        //ShowMessage('傳送失敗');
      end;
    end
  else if Pos('#get',cmd)=1 then
    begin
      SourceFileName:=Copy(cmd,23,Length(cmd)-22); {request裡的第23字元以後是要下載的檔案名稱}
      if not FileExists(SourceFileName) then //檔案不存在的情形...
        begin
          udp.Send('-1');
          Exit;
        end
      else if FFileOpen then //忙線中的情形...
        begin
          udp.Send('-2');
        end
      else
        begin  //開始傳送檔案(先傳送檔案大小的資訊給client端)...
          AssignFile(f,SourceFileName);
          Reset(f,1);
          FFileOpen:=true;
          udp.Send(IntToStr(FileSize(f)));
        end;
    end
  else if Pos('#next',cmd)=1 then //繼續傳送檔案資料...
    begin
      if not FFileOpen then Exit;
      BlockRead(f,buffer,SizeOf(buffer),NumRead);
      udp.SendBuffer(buffer,NumRead);
      if Eof(f) then
        begin
          CloseFile(f);
          FFileOpen:=false;
        end;
    end;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  FFileOpen:=false;
end;    //...其他code略...    
Client端在發出"#get..."訊息後依據收到的訊息(-1:檔案不存在、-2:忙線中、其他數值表示允許下載以及檔案大小)再做處理 以上程式碼未盡善之處,請多包涵
系統時間:2024-04-25 8:34:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!