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

如何處理接收了的bytes?

尚未結案
gloria.hk
一般會員


發表:18
回覆:17
積分:7
註冊:2005-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-07 20:32:51 IP:210.177.xxx.xxx 未訂閱
各位大大,     我正在寫一個tcp connection 元件, 不斷接收server 的packets <-----><---------------------------------->   A.............................B A = 4 bytes of packet length B = variable size of bytes 我想有一個好像TList 的地方儲存接收了的 B 部分的byte messages, 每當使用者想要message, 我便將TList.items[0] 的byte message 回傳給他, 然後清除那項item.請問我應該怎樣儲存B 部分的bytes?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-08 00:46:24 IP:211.22.xxx.xxx 未訂閱
先宣告一個你要擺放資料的型態與指標例如
 
type
    PData = ^ServerMsg;
    Data=record
     ...... // the rest fields you want
     msg:^byte;          
end;
然後在你使用的類別中的私有或公共區宣告 DataPack,TempPack:PData DataList:TList 在適當地方用DataList.Create串列,在需要時給DataPack連同所含的變數配置New記憶體後,然後用DataList.add加入Linker List中,想要移除時反向操作使用DataList.delete與DataList.Pack移除其中想要刪除的連結,同時記得將其中記錄所含的記憶體一併Dispose歸回系統。 取用連結中的紀錄如下: TempPack := DataList.Item[Index]; bra bra bra... 其餘TList用法請詳查 online help. 發表人 - stallion 於 2005/03/08 00:50:31
gloria.hk
一般會員


發表:18
回覆:17
積分:7
註冊:2005-01-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-09 10:41:37 IP:210.177.xxx.xxx 未訂閱
謝謝Stallion的建議,我現在選擇了用TMemoryStream 和 TList,但當中亦遇到問題。
type
  MyTCPComponent = class(TComponent)
  private
    TcpClient: TIdTCPClient;
    InList: TList;
    OutList: TList;
    procedure ReceiveMsgFromServer;  //將server傳來的packets 加入 inlist
    procedure SendMsgToServer;  //將outlist.items[0] 傳送去server
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Connect;
    procedure Disconnect;
    procedure GetMessage(Var ABuf; Var Count: Integer); //回傳inlist.items[0] 的bytes 給使用者
    procedure SendMessage(Const ABuf; Count: Integer); //將使用者想傳送去server的bytes加入outlist 
  end;
我可以如何知道TcpClient 收了message 而觸發ReceiveMsgFromServer? --- http://gloriaho.blogspot.com
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-09 11:49:48 IP:211.22.xxx.xxx 未訂閱
利用 Socket的 OnRead,或者利用一個Timer檢查接收資料的BUFFER。
gloria.hk
一般會員


發表:18
回覆:17
積分:7
註冊:2005-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-09 11:58:00 IP:210.177.xxx.xxx 未訂閱
我找不到OnRead 的 event,是不是 TIdTCPConnection.OnWork? --- http://gloriaho.blogspot.com
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-09 19:53:33 IP:211.22.xxx.xxx 未訂閱
是onwork沒錯,另請注意讀寫模式 AWorkMode indicates the operation performed and the notification sent to OnWork. AWorkMode can be contain one of the following values: wmRead - The component is reading data from the peer. wmWrite - The component is sending data to the peer.
cocainy
一般會員


發表:0
回覆:2
積分:0
註冊:2002-05-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-11 09:56:00 IP:218.104.xxx.xxx 未訂閱
//客户端监听线程 TListenThread = class(TThread) private {} protected procedure Execute; override; procedure HandleRecv; end; ///////// var FrmBlackNameMsgQry: TFrmBlackNameMsgQry; CurrentMsg : string; //IdTcpClient 接收线程 ClientListenThread: TListenThread; ////////// {---------------------------- TListenThread Impl------------------------------} procedure TListenThread.Execute; begin FreeOnTerminate:= true; while not Terminated do begin try iMaxLen:=FrmBlackNameMsgQry.FIdTcpClient.ReadFromStack(false, 10, false); if iMaxLen>0 then begin FrmBlackNameMsgQry.FIdTcpClient.ReadBuffer(Buffer,iMaxLen); Synchronize(Self.HandleRecv); end; except end; end; end; procedure TListenThread.HandleRecv; var StrList : TStringList; aMsg : PMsg; iRow : integer; begin try StrList:=TStringList.Create; //分割数据包 FrmBlackNameMsgQry.SplitPackage(Buffer,iMaxLen,StrList); //if StrList.Count<>4 then exit; New(aMsg); aMsg.RcvNum:=StrList.Strings[0];//RcvNum aMsg.SendNum:=StrList.Strings[1];//SendNum aMsg.RecTime:=StrList.Strings[2];//RecTime aMsg.BlackRule:=StrList.Strings[3];//BlackRule aMsg.Content:=StrList.Strings[4];//Content //aMsg.ServerNum:=StrList.Strings[5];//ServerNum FrmBlackNameMsgQry.MsgQueue.Push(aMsg); if FrmMsgList.IsChanged then begin FrmMsgList.grdMsg.RowCount:=FrmMsgList.grdMsg.RowCount 1; iRow:=FrmMsgList.grdMsg.RowCount-1; FrmMsgList.grdMsg.Cells[0,iRow]:=StrList.Strings[1];//发送号码 FrmMsgList.grdMsg.Cells[1,iRow]:=StrList.Strings[0];//接收号码 FrmMsgList.grdMsg.Cells[2,iRow]:=StrList.Strings[2];//记录时间 FrmMsgList.grdMsg.Cells[3,iRow]:=StrList.Strings[4];//消息内容 end else begin iRow:=FrmMsgList.grdMsg.RowCount-1; FrmMsgList.grdMsg.Cells[0,iRow]:=StrList.Strings[1]; FrmMsgList.grdMsg.Cells[1,iRow]:=StrList.Strings[0]; FrmMsgList.grdMsg.Cells[2,iRow]:=StrList.Strings[2]; FrmMsgList.grdMsg.Cells[3,iRow]:=StrList.Strings[4]; FrmMsgList.IsChanged:=True; end; //播放声音 //sndPlaySound(FrmBlackNameMsgQry.pSound,snd_Async or snd_Memory);//pSound为全局变量 finally FreeAndNil(StrList); end; end; ///////////////// procedure TFrmBlackNameMsgQry.SplitPackage(Buf: array of Byte; DataLen: integer; var StrList: TStringList); var iLen,iIdx : integer; Str : ShortString; begin //(数据长度)(数据)(数据长度)(数据)... iIdx := 0; while iIdx < DataLen do begin iLen := Buf[iIdx]; if iIdx iLen > DataLen then Exit; Move(Buf[iIdx], Str[0], iLen SizeOf(Byte)); StrList.Add(Str); Inc(iIdx, iLen SizeOf(Byte)); end; end;
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-26 13:51:02 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-07-09 19:35:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!