使用C#连接/重试连接的最有效方法?

时间:2009-12-15 06:52:55

标签: c# .net network-programming winsock

我正在创建一个小游戏客户端,最终将连接到服务器以收集有关可用游戏的一些信息,玩家有多少玩家,以及您可以想象应该做的各种其他内容。 / p>

我遇到的困难是在第一次加载时找到处理连接/重试连接序列的有效方法。

我想我的客户会在尝试连接时遵循这个过程:

  1. 已执行客户端应用程序
  2. 尝试建立连接
  3. 如果连接成功收集信息 - 如果不成功,请继续执行步骤4
  4. 显示一个新对话框/表单,提示用户尝试建立连接
  5. 循环直到建立连接
  6. 我一直在质疑我尝试遵循这个序列的方法。我怀疑它是否是正确/最有效的连接方式以及为什么我在第4步中显示的表单不起作用?

    try
    {
        sock.Connect(authenServerEP);
        // Once connected show our main client window
        this.Show();
        // Create the LoginForm once a connection has been established and display
        LoginForm loginForm = new LoginForm();
        loginForm.ShowDialog();
        if (false == loginForm.Visible)
        {
            loginForm.Dispose();
        }
    }
    catch (SocketException firstConnectException)
    {
        // Load retrying connection form
        EstablishingConnectionForm establishingConnectionForm = new EstablishingConnectionForm();                                
        establishingConnectionForm.Show();
    
        bool connected = false;
        // Loop until we are connected
        while (!connected)
        {
            try
            {
                sock.Connect(authenServerEP);
                connected = true;
                establishingConnectionForm.Dispose();
             }
             catch (SocketException retryConnectException)
             {
                 // Pass and retry connection
             }
         }
    } // end catch (SocketException firstConnectException)   
    

    正如您所看到的,我正在捕获在连接到服务器时出现问题时引发的SocketException(例如服务器未运行)。然后我继续尝试不断循环,直到建立连接。我不知道我是否应该这样做。有更好的方法吗?

    当我用Show()显示establishConnectionForm时,它看起来并不像所有的表单/工具初始化(初始化可能会产生误导)。表单上的标签只是以白色阴影显示而不是显示文本。不仅如此,但似乎我无法选择表单/对话框并实际移动它。它坐在那里有“Thinking / Working”鼠标图标。现在我认为这是因为我正在循环尝试重新连接并因此而阻塞(我可能在阻塞时出错了吗?)。多线程可以解决这个问题吗?如果需要,我需要多线程吗?是否有一种更简单的方式来显示我的表单/对话框并且能够进行交互(IE影片围绕并用右上角的'X'关闭它),同时我还在尝试重新连接?

    非常感谢。我非常感谢你阅读这篇文章,并对这个社区表示感谢。 :d

1 个答案:

答案 0 :(得分:4)

下面是一个例子,我将处理catch中的任何延续逻辑,并在while循环中突破或继续。

安德鲁

while (!connected)
{
    try
    {
        sock.Connect(authenServerEP);
        connected = true;
        establishingConnectionForm.Dispose();
    }
    catch (SocketException retryConnectException)
    {
        //Optional - add some wait time may be 5 seconds i.e. "trying again in 5 seconds"
        //System.Threading.Thread.Sleep(5000);
        //Here check the number of attempts and if exceeded:
        if(numberOfTimes == 5)
        {
            break;
        }
        else
        {
            numberOfTimes++; 
            continue;
        }
    }
}