我正在為 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)
uj5u.com熱心網友回復:
您將資料包發送到地址IPAddress.Any和服務器的埠,而不是客戶端的 IP 地址和埠。
客戶端的 IP 地址和埠存盤在data.RemoteEndPoint.
如何找到這個:注意ReceiveAsync回傳一個Task<UdpReceiveResult>-UdpReceiveResult是任務的“回傳型別” -await等待任務完成,然后給你UdpReceiveResult。然后看到UdpReceiveResult有一個名為RemoteEndPointwhich is what you want 的欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512345.html
