gpt4 book ai didi

C# UDP 数据包发送和接收

转载 作者:行者123 更新时间:2023-11-30 21:33:15 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用 C# 作为客户端通过 UDP 协议(protocol)发送和接收数据,并让 JS 服务器运行以传输“响应”数据包以进行测试。

下面是我为测试制作的UDP类,它只是2个线程:
一个从 UDP 读取接收到的数据,另一个线程用于发送数据。

using System;
using System.Collections.Generic;
using System.Text;

using System.Net;
using System.Net.Sockets;

using System.Threading;

namespace UDPTesting {

class UDPHandler {

private int receivePort, sendPort;
private string serverIP;
private IPEndPoint sendEndPoint, receiveEndPoint;

public UDPHandler(string serverIP, int receivePort, int sendPort) {
this.serverIP = serverIP;
this.receivePort = receivePort;
this.sendPort = sendPort;
this.sendEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.sendPort);
this.receiveEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.receivePort);
this.readerUdpClient();
this.senderUdpClient();
}

void readerUdpClient() {
UdpClient readerClient = new UdpClient();
IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Any, 3000);
readerClient.Client.Bind(localEndpoint); //Tried both Connect and Bind
//readerClient.Connect(this.receiveEndPoint);
Thread t = new Thread(() => {
Console.WriteLine("Awaiting data from server...");
var remoteEP = new IPEndPoint(IPAddress.Any, 3000);
byte[] bytesReceived = readerClient.Receive(ref remoteEP);
//The above throws: System.InvalidOperationException: 'You must call the Bind method before performing this operation'
Console.WriteLine("Received data from " + remoteEP.ToString());
});
t.Start();
}

void senderUdpClient() {
UdpClient senderClient = new UdpClient();
senderClient.Connect(this.sendEndPoint);
string sendString = "1;2;3";
byte[] bytes = toBytes(sendString);
Thread t = new Thread(() => {
while (true) {
senderClient.Send(bytes, bytes.Length);
Thread.Sleep(1000);
}
});
t.Start();
}

public byte[] toBytes(string text) {
return Encoding.UTF8.GetBytes(text);
}

public string fromBytes(byte[] bytes) {
return Encoding.UTF8.GetString(bytes);
}

}
}

此外,我的程序的“主要”是这样的:

using System;
using System.Threading;

namespace UDPTesting {

class Program {

static void Main(string[] args) {
string serverIP = "46.101.102.243";
int sendPort = 41234;
int receivePort = 3000;
UDPHandler handler = new UDPHandler(serverIP, receivePort, sendPort);
}

}

}

如何在从客户端向服务器发送数据的同时读取服务器在客户端发送的响应?

我们单独测试了它:

1) 从客户端发送 UDP 数据包 -> 服务器有效,因为我可以看到服务器收到了数据包。

2) 从服务器发送一个 UDP 数据包 -> 客户端工作,正如我所看到的客户端接收到数据包。

3) 当客户端尝试同时发送和读取时,它会向服务器发送数据,但不会读取响应。

如有任何帮助,我们将不胜感激!

最佳答案

你的接收函数应该像这样工作

void readerUdpClient()
{
new Thread(() => {
UdpClient readerClient = new UdpClient(receivePort);
Console.WriteLine("Awaiting data from server...");
var remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] bytesReceived = readerClient.Receive(ref remoteEP);
Console.WriteLine($"Received {bytesReceived.Length} bytes from {remoteEP}");
}).Start();
}

UdpClient constructor需要一个端口会自动为您绑定(bind)本地端点。

关于C# UDP 数据包发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51557435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com