[英]Issue with receiving response from 127.0.0.1 with udp client in python
[英]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.