IdUDPClient 控件怎么接收数据的

IdUDPClient 控件怎么接收数据的,第1张

实在想用可以在server发送一个字符串,client接受到以后,反馈一个什么的字符串,表示正常通讯了

在Client端:

procedure TUDPMainFormSendButtonClick(Sender: TObject);

var

MessageID: Integer;

ThisMessage: String;

ReceivedString: String;

begin

MessageID := Random(MAXINT);

ThisMessage := 'Message: ' + IntToStr(MessageID);

UDPMemoLinesAdd('Sending ' + ThisMessage);

UDPClientSend(ThisMessage);

ReceivedString := UDPClientReceiveString(); //该方法取得由服务端返回的信息。

if ReceivedString = '' then

UDPMemoLinesAdd('No response received from the server after ' + IntToStr(UDPClientReceiveTimeout) + ' millseconds')

else

UDPMemoLinesAdd('Received: ' + ReceivedString)

end;

Server端:

procedure TUDPMainFormUDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);

var

DataStringStream: TStringStream;

s: String;

begin

DataStringStream := TStringStreamCreate('');

try

DataStringStreamCopyFrom(AData, ADataSize);

UDPMemoLinesAdd('Received "' + DataStringStreamDataString + '" from ' + ABindingPeerIP + ' on port ' + IntToStr(ABindingPeerPort));

s := 'Replied from ' + UDPServerLocalName + ' to "' + DataStringStreamDataString + '"';

ABindingSendTo(ABindingPeerIP, ABindingPeerPort, s[1], Length(s));

finally

DataStringStreamFree;

end;

UDP接收比TCP接收要简单很多,性能也要高很多

假设你要接受的UDP包都是最大MTU,不大于1500字节一个包,100万个UDP包也就是15GBps的流量,这个并不困难,当然首先网口要有足够的带宽。我以前开发的流媒体转发服务,在生产环境下,一台设备上游UDP包可以接收27GBps,并同时转发出去。

当然这个和程序运行的设备配置是有关系的,主要是网卡和CPU

给你几个建议:

1:多线程处理,单个线程处理能力还是有限的,同时尽量把线程绑定到CPU核上。

2:linux系统的网络参数要优化,包括读写缓冲区大小

3:如果非必要,可以采用阻塞模式接收,性能比非阻塞要好。

udpclient 设置为组播public class Custom

{

    // 设置IP,IPV6

    private static readonly IPAddress GroupAddress = IPAddressParse("17218125204");

    // 设置端口

    private const int GroupPort = 18090;

    private static void StartListener()

    {

        bool done = false;

        UdpClient listener = new UdpClient();

        IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);

        try

        {

            //IPV6,组播

            listenerJoinMulticastGroup(GroupAddress);

            listenerConnect(groupEP);

            while (!done)

            {

                ConsoleWriteLine("等待数据");

                byte[] bytes = listenerReceive(ref groupEP);

                ConsoleWriteLine("从服务器: {0} : 接收到数据:{1}", groupEPToString(), EncodingASCIIGetString(bytes, 0, bytesLength));

            }

            listenerClose();

        }

        catch (Exception e)

        {

            ConsoleWriteLine(eToString());

        }

    }

    public static int Main(String[] args)

    {

        StartListener();

        return 0;

    }

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » IdUDPClient 控件怎么接收数据的

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情