IdUDPClient 控件怎么接收数据的
实在想用可以在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;
}
}
0条评论