我在Xamarin中进行了一个应用程序。表单项目,我可以使用TCP连接将我的Android手机连接到我的电脑。我在使用两个TcpClient时都发现了。ConnectAsync和TcpClient。BeginConnect,它们都返回该客户端。即使端口未打开,Connected也是true。我已经验证了这一点,因为我尝试了随机IP和随机端口,但它仍然表示连接成功。
使用TcpClient时。ConnectAsync,它不会返回true,除非我按下运行button_Clicked下代码的按钮2次,但当使用TcpClient时。BeginConnect,客户端。Connected总是返回true。我知道客户端没有连接,因为我有一个检测系统,当连接丢失时,它会将用户踢到重新连接页面。
我在MainPage.xaml.cs:中的TCPClient代码
TcpClient client = new TcpClient();
private async void Button_Clicked(object sender, EventArgs e)
{
await client.ConnectAsync(ipAddress.Text, Convert.ToInt32(Port.Text));
if (client.Connected)
{
await DisplayAlert("Connected", "The client has successfully connected", "OK");
}
else
{
await DisplayAlert("Connection Unsuccessful", "The client couldn't connect!", "OK");
}
}
我也尝试过使用TcpClient。BeginConnect从如何设置TcpClient的超时?:
TcpClient client = new TcpClient();
private async void Button_Clicked(object sender, EventArgs e)
{
var result = client.BeginConnect(ipAddress.Text, Convert.ToInt32(Port.Text), null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
if (success)
{
await DisplayAlert("Connected", "The client has successfully connected", "OK");
}
else
{
await DisplayAlert("Connection Unsuccessful", "The client couldn't connect!", "OK");
}
}
我试着查找这个问题,唯一找到的是:TcpClient。Connected返回true,但客户端未连接,我可以使用什么?但是,这个链接说明客户端。Connected bool在断开连接后仍然是真的,而我的问题是,即使客户端从未真正连接到服务器,它也会显示客户端连接。
项目当前正在使用。NET标准2.0
我已经找到了它返回客户端的原因。Connected为true是因为在客户端仍在尝试连接且尚未超时的情况下运行两次相同的ConnectAsync/BeginConnect方法会导致客户端。由于某种原因,连接值为true。
解决这个问题的唯一方法是等待超时完成,或者如果超时太长,则处理客户端并创建新客户端。