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

时间:2021-08-24 08:32:46
INDY控件 的TCPClient控件和TCPServer使用的时候碰到下面的问题:
TCPClient用来连接到服务器,可以发送数据,但是,不能主动接收TCPServer发来的数据,只能自己发一条,然后立即收一条。

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

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

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

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

另外我客户端是在私网内的,所以请不要提出在客户端放一个服务端控件的想法,因为服务器不能连接到客户机的。只能由客户端去连接服务端。

5 个解决方案

#1


当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读

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

http://lysoft.7u7.net

#2


加个定时器定时检测

#3


那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?

莫非要用高级的多媒体定时器?

#4


我觉得应该有一个时间通知啊。

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

高人来说说。。

#5


参考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;

#1


当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读

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

http://lysoft.7u7.net

#2


加个定时器定时检测

#3


那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?

莫非要用高级的多媒体定时器?

#4


我觉得应该有一个时间通知啊。

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

高人来说说。。

#5


参考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;