首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • TIdTcpserver如何保持多个客户端数据同步? [已结帖,结帖人:cai_kkk]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cai_kkk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-19 23:28:11 楼主
    需求:
    1.长连接网络通信,利用TIdTcpserver,对每个不同的客户端发送来的数据进行分析,然后根据一定的逻辑判断,给这些客户端返回不同的对应数据.
    和网络游戏有些类似.当client1连接并发送数据时,IdTcpserver将Data2,Data3..Datan分别发送给client2,client3..clientn(已连接的其他客户端).
    2.利用TIdTcpserver及时发现并关闭不活动的网络连接,比如有的客户机已经死机或突然断线.

    装的D7没有Indy的Demo.自己研究了半天也没找到合适的实现方法,关键是有了数据Data2后,无法确定哪个连接线程是client2的.
    自己的想法:
    {
      在TIdTcpserver的OnExcute方法里获取Athread的threadID和客户端IP,将两者建立对照关系(对照表).
      在往指定的客户端(client2)发送数据时,根据IP找到threadID,然后循环将TIdTcpserver.Threads.LockList.Items[i]取出,
      If TIdTcpserver.Threads.LockList.Items[i].ThreadId=client2 IP对应的threadID Then
        TIdTcpserver.Threads.LockList.Items[i].Connection.WriteLn(Data2);
    }
    不知道以上想法是否可行,或者不是最合适的?
    另外,是不是每次调用了LockList完毕后必须调用UnLockList?
    还请各位给出代码指教,谢谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 23:45:501楼 得分:20
    通过请求类型或者一些特定的字段来判断应该返回那个数据,这样就不需要查询和对照了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cai_kkk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 23:55:372楼 得分:0
    To kernelj :
    谢谢回复,但你说的正是我要解决的问题啊.特定的字段还是要和AThread的ThreadID对应吧.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • flychenjun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 08:36:583楼 得分:60
    先定义一个记录类型:
    Delphi(Pascal) code
    type PClient = ^TClient; TClient = record UserID : String[20]; Hostname : String[20]; { Hostname } Port : integer; ConnectTime, { Time of connect } LastActionTime : TDateTime; { Time of last transaction } MainHandle : THandle; Thread : Pointer; { Pointer to thread } end;


    再定义一个TThreadList记录在线客户数据:
    Delphi(Pascal) code
    Clients : TThreadList;

    当有客户连接或登录时
    Delphi(Pascal) code
    try with Clients.LockList do begin if IndexOf(PClient(AThread.Data)) <0 then begin GetMem(NewClient, SizeOf(TClient)); NewClient.UserID := UserID; NewClient.Hostname := AThread.Connection.LocalName; NewClient.ConnectTime := Now; NewClient.LastActionTime := Now; NewClient.Thread := AThread; NewClient.MainHandle := MainHandle; AThread.Data := TObject(NewClient); Add(NewClient) end end ; finally Clients.UnlockList; end;


    向指定 客户发送数据
    Delphi(Pascal) code
    var RecThread: TIdPeerThread; i:integer; begin with Clients.LockList do begin for i:=0 to count -1 do if PClient(items[i]).Hostname = Ip then //客户IP RecThread := PClient(items[i]).AThread; end; Clients.Unlock; .....再向RecThread 写数据; end;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cai_kkk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:40:024楼 得分:0
    To flychenjun :
    谢谢回复。我回去试一下。
    欢迎大家继续指教!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qian_longN1
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:18:465楼 得分:20
    TIdTcpserver本身是不会记录所连接过的client的,只能自己建立一个类型之类的记录联接过的client信息,需要时从里面找到制定client信息,比如IP之类的发送
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved