读书人

UDP简单应用待利马揭帖

发布时间: 2012-03-14 12:01:13 作者: rapoo

【急】UDP简单应用,在线等待,利马揭帖
实现要求:
【服务端】:安装了一个简单服务程序,用于接收客户端发送的信息,并返回一个结果串。
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.如果很多客户端同时发消息给服务端,服务端的相应会不会出现问题? 采用多线程是否能解决此问题

如果客户端确实是因为同步操作问题而接收不到数据,那么这样的问题如何解决或者说如何避免,请有相关经验的朋友帮忙解答一下,谢谢了!




[解决办法]
UDP丢包很正常
[解决办法]
UDP 也没什么多线的办法, 收数据用的是 recvform 这个只能由单线去完成
receform 类同于 tcp 的 listen, 有一个 maxconn 限制, 限制在 5, 换句话说, 同时 5 个消息在队列中没处理就会引起丢包
因此, udp 的收数据线程应该很单纯, 单纯到只收数据到一个 buffer, 用另外线程去处理, 任何的处理都不应在本线程完成, 让在队列中的消息始终小于 5
[解决办法]
1.使用UDP通信是否有客户端数量和连接数的限制?
UDP丢包很正常。


2.如果很多客户端同时发消息给服务端,服务端的相应会不会出现问题?
要解决丢包问题,必须有应答机制。多线程与丢包没啥关系。

读书人网 >.NET

热点推荐