我现在在管理系统上用TIdTCPServer做了个Server端,下位机用GPRS跟系统通讯,平时现在采用长连方式,就是每隔一个固定时间GPRS端就会发一个包,以维持这个连接,我的TIdTCPServer写了OnConnect和OnExecute(主要:读CurrentReadBuffer,再根据判断是心跳包或是数据包或是退出之类),我现在想要在这个基础上实现对一个ListView(列的是表地址,例如水表之类的)里面的记录实现抄写下位机的数据,这个通讯过程通过GPRS来实现,我现在的问题是:我如果在一个循环中把表地址下发一个(用CurThread.Connection.WriteLn),等一会再读TIdTCPServer的CurrentReadBuffer(现暂考虑这样一个GPRS连接),那么势必会跟TIdTCPServer的OnExecute中的处理相冲突,现在不知道怎么处理好了,这个TIdTCPServer我也是第一次用,很多东西还在摸索中,希望熟悉的人帮忙一下,有没有好的办法可以解决我的问题?
解决方案 »
- 有没有人知道QQ2011版的截图是怎么做出来的?整屏变灰之后,还能取得鼠标所在位置的窗体句柄,求思路!
- 获取网页源代码的问题 50分
- 数据导出到excel的时候,如何除掉缺少的三个工作薄(sheet1,sheet2,sheet3)?
- 求助:DELPHI中ASM转换为VC的ASM(20行代码)有关RING0的
- 关于操作excel
- 请问下载完后的控件怎么添加
- 关于delphi开发一个类的问题
- 2.如何將Widestring轉變Pchar為類型?
- 倾囊求助,如果可以给0+945+30分的话
- 高分求教:updatesql如果实现动态sql编程
- quickreport预览可以看到的qrlabel,打印是空白的?
- 怎么操作控件组?
begin
//知道是哪一個IP連接到你的服務端
Memo.Lines.Append('Rec IP : '+AContext.Connection.Socket.Binding.PeerIP);
end;
procedure TfrmMain.IdTCPServer1Execute(AContext: TIdContext);
var
A : TBytes;
H1,H2 : Byte;
CommPassword : Array[0..3] of AnsiChar;
PacketLen : Word;
packHead : TPackHead;
CheckSum : Byte;
B : TBytes;
begin
Sleep(10);
if AContext.Connection.IOHandler.InputBuffer.Size <= 19 then exit; AContext.Connection.IOHandler.ReadBytes(A,AContext.Connection.IOHandler.InputBuffer.Size,false);
H1 := A[0];
H2 := A[1];
case packHead.command of
$0 :
begin
//heart ;
CheckIsConnect(AContext);
end;
$01:
OnExecute 在你這裏就相當於一個輪詢,在有數據的時候會自動觸發這個過程的執行。而你只需要處理好各個線程之間的關第就可以了。
你的意思是不是只要GPRS连上移动网后,就算跟Server之间的连接断开,Server也可以根据那个IP地址连GPRS吗?不好意思,不知道是不是我的理解有误,因为我刚接触GPRS没多久,虽然资料查了不少,但是懂的还是很少,一个熟悉的朋友曾跟我说只能GPRS连Server,而在连接断开的情况下,Server端不可能连接上的。