我正在创建一个小游戏客户端,最终将连接到服务器以收集有关可用游戏的一些信息,玩家有多少玩家,以及您可以想象应该做的各种其他内容。 / p>
我遇到的困难是在第一次加载时找到处理连接/重试连接序列的有效方法。
我想我的客户会在尝试连接时遵循这个过程:
我一直在质疑我尝试遵循这个序列的方法。我怀疑它是否是正确/最有效的连接方式以及为什么我在第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
答案 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;
}
}
}