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;

你检查一下你程序其他地方看看,try
UdpClient1SendBuffer(IP,Port,HandDataPackage,SizeOf(HandDataPackage));
except
On E: Exception do
showmessage(eMessage);
end;
是没问题的

UDP服务器:

using System;
using SystemText;
using SystemNet;
using SystemNetSockets;
namespace ConsoleUdpServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamilyInterNetwork,
                SocketTypeDgram,
                ProtocolTypeUdp);
            EndPoint localEP = new IPEndPoint(IPAddressParse("127001"), 8002);
            socketBind(localEP);
            //启动异步接收
            State state = new State(socket);
            socketBeginReceiveFrom(
                stateBuffer, 0, stateBufferLength,
                SocketFlagsNone,
                ref stateRemoteEP,
                EndReceiveFromCallback,
                state);
            ConsoleReadLine();
            socketClose();
        }
        //异步接收回调函数
        static void EndReceiveFromCallback(IAsyncResult iar)
        {
            State state = iarAsyncState as State;
            Socket socket = stateSocket;
            try
            {
                //完成接收
                int byteRead = socketEndReceiveFrom(iar, ref stateRemoteEP);
                //显示客户端地址和端口
                ConsoleWriteLine("客户端终结点:{0}", stateRemoteEPToString());
                //显示接收信息
                ConsoleWriteLine("接收数据字节数:{0}", byteRead);
                string message = EncodingDefaultGetString(stateBuffer, 0, byteRead);
                ConsoleWriteLine("来着客户端信息:{0}", message);
                //向客户端发送信息
                SendMeaage(socket, stateRemoteEP, "成功接收!");
            }
            catch (Exception e)
            {
                ConsoleWriteLine("发生异常!异常信息:");
                ConsoleWriteLine(eMessage);
            }
            finally
            {
                //非常重要:继续异步接收
                socketBeginReceiveFrom(
                    stateBuffer, 0, stateBufferLength,
                    SocketFlagsNone,
                    ref stateRemoteEP,
                    EndReceiveFromCallback,
                    state);
            }
        }
        /// <summary>
        /// 向客户端发送信息
        /// </summary>
        /// <param name="socket">本地Socket(服务器Socket)</param>
        /// <param name="remoteEndPoint">客户端终结点</param>
        /// <param name="Message">信息</param>
        static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message)
        {
            byte[] bytes = EncodingDefaultGetBytes(Message);
            socketSendTo(bytes, remoteEndPoint);
        }
    }
    /// <summary>
    /// 用于异步接收处理的辅助类
    /// </summary>
    class State
    {
        public State(Socket socket)
        {
            thisBuffer = new byte[1024];
            thisSocket = socket;
            thisRemoteEP = new IPEndPoint(IPAddressAny, 0);
        }
        /// <summary>
        /// 获取本机(服务器)Socket
        /// </summary>
        public Socket Socket { get; private set; }
        /// <summary>
        /// 获取接收缓冲区
        /// </summary>
        public byte[] Buffer { get; private set; }
        /// <summary>
        /// 获取/设置客户端终结点
        /// </summary>
        public EndPoint RemoteEP;
    }
}

UDP客户端

using System;
using SystemText;
using SystemNet;
using SystemNetSockets;
namespace ConsoleUdpClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamilyInterNetwork,
                SocketTypeDgram,
                ProtocolTypeUdp);
            //客户端使用的终结点
            EndPoint localEP = new IPEndPoint(IPAddressAny, 0);
            socketBind(localEP);
            //启动异步接收
            State state = new State(socket);
            socketBeginReceiveFrom(
                stateBuffer, 0, stateBufferLength,
                SocketFlagsNone,
                ref stateRemoteEP,
                EndReceiveFromCallback,
                state);
            //向服务器发送信息
            EndPoint remoteEP = new IPEndPoint(IPAddressParse("127001"), 8002);
            SendMeaage(socket, remoteEP, "你好,这里是客户端,收到请回复!Over~~~~");
            ConsoleReadLine();
            socketClose();
        }
        //异步接收回调函数
        static void EndReceiveFromCallback(IAsyncResult iar)
        {
            State state = iarAsyncState as State;
            Socket socket = stateSocket;
            try
            {
                //完成接收
                int byteRead = socketEndReceiveFrom(iar, ref stateRemoteEP);
                //显示服务器地址和端口
                ConsoleWriteLine("服务器终结点:{0}", stateRemoteEPToString());
                //显示接收信息
                ConsoleWriteLine("接收数据字节数:{0}", byteRead);
                string message = EncodingDefaultGetString(stateBuffer, 0, byteRead);
                ConsoleWriteLine("来着服务器的信息:{0}", message);
            }
            catch (Exception e)
            {
                ConsoleWriteLine("发生异常!异常信息:");
                ConsoleWriteLine(eMessage);
            }
            finally
            {
                //非常重要:继续异步接收
                socketBeginReceiveFrom(
                    stateBuffer, 0, stateBufferLength,
                    SocketFlagsNone,
                    ref stateRemoteEP,
                    EndReceiveFromCallback,
                    state);
            }
        }
        /// <summary>
        /// 向服务器发送信息
        /// </summary>
        /// <param name="socket">本地Socket</param>
        /// <param name="remoteEndPoint">服务器终结点</param>
        /// <param name="Message">信息</param>
        static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message)
        {
            byte[] bytes = EncodingDefaultGetBytes(Message);
            socketSendTo(bytes, remoteEndPoint);
        }
    }
    /// <summary>
    /// 用于异步接收处理的辅助类
    /// </summary>
    class State
    {
        public State(Socket socket)
        {
            thisBuffer = new byte[1024];
            thisSocket = socket;
            thisRemoteEP = new IPEndPoint(IPAddressAny, 0);
        }
        /// <summary>
        /// 获取本机Socket
        /// </summary>
        public Socket Socket { get; private set; }
        /// <summary>
        /// 获取接收缓冲区
        /// </summary>
        public byte[] Buffer { get; private set; }
        /// <summary>
        /// 获取/设置客户端终结点
        /// </summary>
        public EndPoint RemoteEP;
    }
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13417005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-01
下一篇 2023-08-01

发表评论

登录后才能评论

评论列表(0条)

保存