繁体   English   中英

UDP 客户端未收到响应

[英]UDP client isn't receiving a response

我正在为 python 脚本和 WinForm 应用程序之间的数据传输创建一个解决方案。 我目前的问题是,当接收到数据并生成并发回接收到的消息时,python 脚本永远看不到它。

在我引入异步功能之前它一直在工作,但我想用它来关闭正在处理服务器的服务器/线程。

这是我的服务器代码(C#):

private void btnConnect_Click(object sender, EventArgs e)
        {
            InitializeUDP();
        }

        public void InitializeUDP()
        {
            //Create the server
            endPoint = new IPEndPoint(IPAddress.Any, PORT);
            udpClient = new UdpClient(endPoint);

            ShowMsg("Waiting for a client...");
            //Create the client end.

            //Start listening
            listenThread = new Thread(new ThreadStart(Listening));
            listenThread.Start();
        }
        private void Listening()
        {
            byte[] resp;

            //Listening loop
            Task.Run(async () =>
            {
                while (true)
                {
                    //Receive a message from a client
                    var data = await udpClient.ReceiveAsync();
                    string receivedMsg = Encoding.ASCII.GetString(data.Buffer);
                    //Show the message.
                    this.Invoke(new ShowMessageMethod(ShowMsg), new object[] { "Client:" + receivedMsg });
                    //Send a response message
                    resp = Encoding.ASCII.GetBytes("Server:" + receivedMsg);
                    udpClient.Send(resp, resp.Length, endPoint);
                    //Sleep for UI to work
                    Thread.Sleep(500);
                }
            });
        }
        private void ShowMsg(string msg)
        {
            this.tbTest.Invoke((MethodInvoker)(() => this.tbTest.Text += msg + "\r\n"));
        }

        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            Stop();
        }
        private void Stop()
        {
            //Stop listening
            ShowMsg("Server stopping...");
            udpClient.Close();
            ShowMsg("Server stopped.");
        }

这是我的客户端代码(python):

import socket

msgFromClient       = "Hello UDP Server"
bytesToSend         = str.encode(msgFromClient)
serverAddressPort   = ("127.0.0.1", 12345)
bufferSize          = 1024

# Create a UDP socket at client side

UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

# Send to server using created UDP socket

UDPClientSocket.sendto(bytesToSend, serverAddressPort)

msgFromServer = UDPClientSocket.recvfrom(bufferSize)

msg = "Message from Server {}".format(msgFromServer[0])

print(msg)

您正在将数据包发送到地址IPAddress.Any和服务器的端口,而不是客户端的 IP 地址和端口。

客户端的 IP 地址和端口存储在data.RemoteEndPoint中。

如何找到它:注意ReceiveAsync返回一个Task<UdpReceiveResult> - UdpReceiveResult是任务的“返回类型” - await等待任务完成然后给你UdpReceiveResult 然后看到UdpReceiveResult有一个名为RemoteEndPoint的字段,这就是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM