我正在使用客户端-服务器拱创建一个简单的统一应用程序。只要打开服务器,我的应用程序就可以正常工作。如果偶然在服务器未运行时尝试运行客户端,则统一应用程序冻结。
我还按照各种帖子中的建议使用了连接超时,但是没有帮助。
void Awake () {
init ();
}
void init() {
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse (serverHost), serverPort);
client = new Socket (endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try {
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
client.Connect (endpoint);
error = "";
} catch(Exception e) {
error = e.Message;
new WaitForSeconds(1);
}
任何建议可能会受到欢迎。
谢谢。
您的客户端冻结了,因为套接字阻塞了。连接超时也无法解决此问题。
我知道有2种方法可以解决此问题。
第一种方法是使用Thread调用包含网络代码的函数,以使其不会冻结。
第二种方法是使用异步套接字。https://msdn.microsoft.com/zh-CN/library/fx6588te(v=vs.110).aspx
我将提供第一种方法的示例,因为我认为这更容易。
我没有您所有的代码,所以我将尽我所能。
将您的代码更改为
using System;
using System.Threading;
bool connected = false;
void init() {
// Create a new Thread
new Thread (() =>
{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse (serverHost), serverPort);
client = new Socket (endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try {
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
client.Connect (endpoint);
error = "";
connected = true;
} catch(Exception e) {
connected = false;
error = e.Message;
new WaitForSeconds(1);
}
}).Start(); // Start the Thread
}
这将创建一个新线程并启动该线程。在该线程内,它将套接字连接代码而不会阻塞您的应用程序。
然后,您可以稍后检查是否已连接到服务器
if(connected){
// ...
}
确保包括在内using System.Threading
;
如果您打算从服务器接收数据,请确保也执行同样的操作,否则它将阻止并挂起您的应用程序。
您在接收功能中要做的就是添加:
new Thread (() =>
{
// .....You receiving code here
}).Start();
您可以在此处了解有关线程的更多信息http://www.albahari.com/threading/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句