实现要求:
【服务端】:安装了一个简单服务程序,用于接收客户端发送的信息,并返回一个结果串。
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: string;
begin
  s:='BBB';
  DataStringStream := TStringStream.Create('');
  try
    DataStringStream.CopyFrom(AData, AData.Size);
    if DataStringStream.DataString = 'AAA' then
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
  finally
    DataStringStream.Free;
  end;
end;
【客户端】:向服务器发送一个请求消息,并接收服务端的返回结果。
  with FUDPClient do
  begin
    Send('AAA');
    sRecive := Trim(ReceiveString());
  end;
【问题】:假如客户端比较少,而且操作不频繁,现在的程序没有任何问题
但是一旦客户端增多,而且操作非常频繁(客户端同时给服务端发消息的几率大大增加)
这个时候问题就来了,经常接收不了数据。请问:
  1.使用UDP通信是否有客户端数量和连接数的限制?
  2.如果很多客户端同时发消息给服务端,服务端的相应会不会出现问题?  采用多线程是否能解决此问题如果客户端确实是因为同步操作问题而接收不到数据,那么这样的问题如何解决或者说如何避免,请有相关经验的朋友帮忙解答一下,谢谢了!  

解决方案 »

  1.   

    UDP 也没什么多线的办法, 收数据用的是 recvform 这个只能由单线去完成
    receform 类同于 tcp 的 listen, 有一个 maxconn 限制, 限制在 5, 换句话说, 同时 5 个消息在队列中没处理就会引起丢包
    因此, udp 的收数据线程应该很单纯, 单纯到只收数据到一个 buffer, 用另外线程去处理, 任何的处理都不应在本线程完成, 让在队列中的消息始终小于 5
      

  2.   

    还有个问题:用TCP是不是不会出现丢包的现象?
      

  3.   

    或者说用TCP相对UDP会稳定的多?
      

  4.   

    应用范围和方式都不同, tcp 是流式协议, udp 是包的, tcp是作可靠传输的, udp 是作快速消息投递的, tcp 连接成本比 udp 大得多, tcp 只是在 ip 协议上加了流控, 理论上 udp 也能作到流控
      

  5.   

    tcp 也会丢包, 但丢包会引起重发, 具体控制不是非常清楚, 程序上是不知道的, 实再是网络不行也不会引起读到的数据不正确而产生的是超时
      

  6.   

    1.使用UDP通信是否有客户端数量和连接数的限制?
    UDP丢包很正常。
    2.如果很多客户端同时发消息给服务端,服务端的相应会不会出现问题?
    要解决丢包问题,必须有应答机制。多线程与丢包没啥关系。
      

  7.   

    1.使用UDP通信是否有客户端数量和连接数的限制?
    UDP根本没有连接,也就谈不上连接限制了。