如何處理接收了的bytes? |
尚未結案
|
gloria.hk
一般會員 發表:18 回覆:17 積分:7 註冊:2005-01-07 發送簡訊給我 |
各位大大, 我正在寫一個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 發送簡訊給我 |
先宣告一個你要擺放資料的型態與指標例如
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
|
gloria.hk
一般會員 發表:18 回覆:17 積分:7 註冊:2005-01-07 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
是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 發送簡訊給我 |
//客户端监听线程
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |