我现在在管理系统上用TIdTCPServer做了个Server端,下位机用GPRS跟系统通讯,平时现在采用长连方式,就是每隔一个固定时间GPRS端就会发一个包,以维持这个连接,我的TIdTCPServer写了OnConnect和OnExecute(主要:读CurrentReadBuffer,再根据判断是心跳包或是数据包或是退出之类),我现在想要在这个基础上实现对一个ListView(列的是表地址,例如水表之类的)里面的记录实现抄写下位机的数据,这个通讯过程通过GPRS来实现,我现在的问题是:我如果在一个循环中把表地址下发一个(用CurThread.Connection.WriteLn),等一会再读TIdTCPServer的CurrentReadBuffer(现暂考虑这样一个GPRS连接),那么势必会跟TIdTCPServer的OnExecute中的处理相冲突,现在不知道怎么处理好了,这个TIdTCPServer我也是第一次用,很多东西还在摸索中,希望熟悉的人帮忙一下,有没有好的办法可以解决我的问题?

解决方案 »

  1.   

    procedure TfrmMain.IdTCPServer1Connect(AContext: TIdContext);
    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:
      

  2.   

    怎么用tcp协议呢,最好用udp来弄
      

  3.   

    是不是如果我想对一个地址例表轮循抄数据,需要把这部分处理都写在TIdTCPServer的OnExecute里面?
      

  4.   

    请问2楼的朋友,为什么要用UDP?我看很多人都说UDP不可靠
      

  5.   


    OnExecute  在你這裏就相當於一個輪詢,在有數據的時候會自動觸發這個過程的執行。而你只需要處理好各個線程之間的關第就可以了。
      

  6.   

    GRPS的网络状况很不稳定,你还让他保持一个长连接这样很不合理,而且也很浪费流量,当你的GRPS接入移动网关会分配一个临时的ip地址,通过这个ip地址你的server就可以和设备之间进行通信。丢包了你可以再发一次。
      

  7.   

    回答#5楼的朋友:我这里虽然是保持长连接,但是并不传送有效的数据包,只是用心跳保持连接不断开,当管理系统需要相关数据的时候,才从后台发请求给GPRS要求抄数据,而且基本上每次抄是把下面带的所有表的数据都抄一次,这里我有个问题没讲清楚,我们现在的GPRS是在一个中继主站上的,这个中继主站下面可以带很多中继(没有GPRS),中继下再挂表。
      

  8.   

    回starluck:首先谢谢你的回复,上次那个帖子的问题也是你帮忙解决的,你现在说的我能懂但是还不是很理解,我先自己想想,不明白的地方明天我还会在帖子里回复的,谢谢!
      

  9.   

    回#7楼的朋友:
    你的意思是不是只要GPRS连上移动网后,就算跟Server之间的连接断开,Server也可以根据那个IP地址连GPRS吗?不好意思,不知道是不是我的理解有误,因为我刚接触GPRS没多久,虽然资料查了不少,但是懂的还是很少,一个熟悉的朋友曾跟我说只能GPRS连Server,而在连接断开的情况下,Server端不可能连接上的。
      

  10.   

    你可以发送心跳包来提交你的设备ip地址,你的设备上也需要做一个udp的监听,这样你的server和设备之间就可以通过udp来通信了。