关于INDY TCP client (客户端)和server(服务端)控件的问题。

dev_uoboy 2005-02-27 03:13:25
INDY控件 的TCPClient控件和TCPServer使用的时候碰到下面的问题:
TCPClient用来连接到服务器,可以发送数据,但是,不能主动接收TCPServer发来的数据,只能自己发一条,然后立即收一条。

如果我用TCPServer,要广播一个消息,那客户端怎么接收啊?难道只能TCPClient主动发了命令后才能接收消息么?

请做过的朋友,给予解答。

如果有其他控件也可以提出来,但是不要说自己从头写一个,那样太费时间了。

我需要的是客户端和服务器端连接上以后都可以主动收发消息。

另外我客户端是在私网内的,所以请不要提出在客户端放一个服务端控件的想法,因为服务器不能连接到客户机的。只能由客户端去连接服务端。
...全文
302 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
getit911 2005-02-27
  • 打赏
  • 举报
回复
参考Indy例子Indy9Demos\Chat

procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
var
Count: Integer;
List : TList;
EMote,
Msg : String;
begin
Msg := Trim(TheMessage);

EMote := Trim(memEMotes.Lines.Values[Msg]);

if WhoFrom <> 'System' then
Msg := WhoFrom + ': ' + Msg;

if EMote <> '' then
Msg := Format(Trim(EMote), [WhoFrom]);

List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
try
for Count := 0 to List.Count -1 do
try
//发消息
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
end;
dev_uoboy 2005-02-27
  • 打赏
  • 举报
回复
我觉得应该有一个时间通知啊。

还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。

高人来说说。。
dev_uoboy 2005-02-27
  • 打赏
  • 举报
回复
那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?

莫非要用高级的多媒体定时器?
kuki84 2005-02-27
  • 打赏
  • 举报
回复
加个定时器定时检测
ly_liuyang 2005-02-27
  • 打赏
  • 举报
回复
当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读

研究过Indy In Depth和Indy的VCL源码就知道的

http://lysoft.7u7.net

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧