首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UdpClient,如何在UdpClient.Connect()成功之前重试它?

使用UdpClient,如何在UdpClient.Connect()成功之前重试它?
EN

Stack Overflow用户
提问于 2016-10-05 14:38:32
回答 1查看 2.7K关注 0票数 0

我的客户机/服务器程序彼此很好地工作,但只有当服务器在我的客户端启动之前启动并运行时才能正常工作。如果客户端在第一次尝试时未能连接,我无法让它再次尝试。

这是我客户的connect方法。

代码语言:javascript
复制
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)上了。

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-05 14:58:14

这是pseudoCode --您必须将一些东西移到类范围以允许将来的发送/接收(您将使用不同的方法)。这只是为了向您展示如何在连接阻塞时进行连接:

代码语言:javascript
复制
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;
 }

然后使用类作用域维护连接的会话,并使用不同的方法发送/接收。这只是为了连接,因为你只需要做一次。

你如何设置这样的东西:

代码语言:javascript
复制
  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);
     }
  }

然后,在另一个类中订阅onNewREceivedEvent并处理入站消息。onNewReceivedEvent += processInboundMEsasage();

这些都是psuedocode和“脑编译”(对其他人来说是creit),所以它只用于演示。没有智慧,我就迷失了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39876960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档