使用 UdpClient,如何重试 UdpClient.Connect() 直到成功?
Using UdpClient, how do you retry UdpClient.Connect() until it succeeds?
我的 client/server 程序可以很好地相互配合,但只有当服务器启动并且 运行 我的客户端启动之前。如果客户端第一次连接失败,我无法让它重试。
这是我客户的 connect
方法。
public void connect()
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
bool connected = false;
while (!connected)
{
try
{
Console.WriteLine("IN CONNECTED");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
connected = true;
Console.WriteLine("RECEIVED INIT");
listen(server_ip);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
我希望看到的是 udp_client.Connect(server_ip)
循环,直到我收到来自服务器的 "INIT" 消息。
就目前而言,没有循环。它似乎卡在 udp_client.Receive(ref server_ip)
上。
如有任何帮助,我们将不胜感激!
这是伪代码 - 您必须将某些内容移动到 class 范围以允许将来 send/receives(您可以使用不同的方法)。这只是为了向您展示当连接阻塞时如何连接:
bool isClientConnected = false;
var connector = new System.ComponentModel.BackgroundWorker();
public void connectToUDP(){
connector.DoWork+= connect;
connector.RunWorkerAsync();
}
private void connect(object sender, DoWorkEventArgs e)
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
try
{
Console.WriteLine("Waiting for server...");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
isClietConnected = true;
Console.WriteLine("now connected");
listen(server_ip);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public bool sendReceiveUDP(string send){
if(!isClientConnected){
return false;
}
//perform send
return true;
}
然后您将使用 class 范围和 send/receive 使用不同的方法维护连接的会话。这仅用于连接,因为您只需要执行一次。
你是如何设置这样的东西的:
private bool isConnected = false();
private bool send(){
if(!isConnected){
connect();
}
//send
}
private bool connect(){
if(!isConnected){
//launch connection thread
}
}
private delegate void onNewReceive(string message);
public event onNewReceive onNewReceiveEvent;
public void fireEvent(string message){
onNewReceiveEvent.Invoke(message);
}
private void waitForData(object sender, DoWorkEventArgs e){
//this is the backgroundworker
while(true){
receive();
fireEvent(message);
}
}
然后,在另一个class中订阅onNewREceivedEvent 并处理入站消息。 onNewReceivedEvent += processInboundMEsasage();
这都是伪代码和 "brain compiled"(对其他人的贡献),因此它仅用于演示。没有智能感知,我迷路了。
我的 client/server 程序可以很好地相互配合,但只有当服务器启动并且 运行 我的客户端启动之前。如果客户端第一次连接失败,我无法让它重试。
这是我客户的 connect
方法。
public void connect()
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
bool connected = false;
while (!connected)
{
try
{
Console.WriteLine("IN CONNECTED");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
connected = true;
Console.WriteLine("RECEIVED INIT");
listen(server_ip);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
我希望看到的是 udp_client.Connect(server_ip)
循环,直到我收到来自服务器的 "INIT" 消息。
就目前而言,没有循环。它似乎卡在 udp_client.Receive(ref server_ip)
上。
如有任何帮助,我们将不胜感激!
这是伪代码 - 您必须将某些内容移动到 class 范围以允许将来 send/receives(您可以使用不同的方法)。这只是为了向您展示当连接阻塞时如何连接:
bool isClientConnected = false;
var connector = new System.ComponentModel.BackgroundWorker();
public void connectToUDP(){
connector.DoWork+= connect;
connector.RunWorkerAsync();
}
private void connect(object sender, DoWorkEventArgs e)
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
try
{
Console.WriteLine("Waiting for server...");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
isClietConnected = true;
Console.WriteLine("now connected");
listen(server_ip);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public bool sendReceiveUDP(string send){
if(!isClientConnected){
return false;
}
//perform send
return true;
}
然后您将使用 class 范围和 send/receive 使用不同的方法维护连接的会话。这仅用于连接,因为您只需要执行一次。
你是如何设置这样的东西的:
private bool isConnected = false();
private bool send(){
if(!isConnected){
connect();
}
//send
}
private bool connect(){
if(!isConnected){
//launch connection thread
}
}
private delegate void onNewReceive(string message);
public event onNewReceive onNewReceiveEvent;
public void fireEvent(string message){
onNewReceiveEvent.Invoke(message);
}
private void waitForData(object sender, DoWorkEventArgs e){
//this is the backgroundworker
while(true){
receive();
fireEvent(message);
}
}
然后,在另一个class中订阅onNewREceivedEvent 并处理入站消息。 onNewReceivedEvent += processInboundMEsasage();
这都是伪代码和 "brain compiled"(对其他人的贡献),因此它仅用于演示。没有智能感知,我迷路了。