这是我的程序处理的方法
////////////////////////////////////////////////////////////////////////////
//7.ClientSocket的OnRead事件定义
////////////////////////////////////////////////////////////////////////////
procedure TSGIPClient.ClientSocketOnRead(Sender: TObject; Socket: TCustomWinSocket);
var
nMsgLength: integer;
nBufferLength: integer;
nCommandId: LongWord;
nResult: integer;
sSequence: string;
sReserve: string;
sSendNumber: string;
sMsgContent: string;
sMsg: string;
CommandName: string;
MessageMemo: String;
begin
MainForm.Ima_SMG.Visible:=true; //将收到消息指示灯点亮
ClientSocketRecvMsg :=ClientSocketRecvMsg + ClientSocket.Socket.ReceiveText;
while (true) do
begin
nBufferLength:= Length(ClientSocketRecvMsg);
if (nBufferLength<4) then
break;
nMsgLength:= SocketStrToInt(copy(ClientSocketRecvMsg,1,4));
if (nMsgLength<nBufferLength) then //若消息未接收完,则不做处理
break;
//取出一个消息,并在缓存里删掉
sMsg:=copy(ClientSocketRecvMsg,1,nMsgLength);
ClientSocketRecvMsg:=copy(ClientSocketRecvMsg,nMsgLength+1,nBufferLength-nMsgLength);
//得到消息头的各个值
nCommandId:=SocketStrToInt(copy(sMsg,5,4));
sSequence:=copy(sMsg, 9, 12);
//根据消息类型进行处理
case (nCommandId) of
SGIP_BIND_RESP:
和你得第二种方法差不多
你也可以这么做:
一个socket负责接收数据,把数据写到一个接收消息列表中
然后再用一个socket随时监控消息列表。
这种办法还是比较稳妥的!
支持你这么做!!