连接丢失后网络流不再有效
Network stream no longer works after connection loss
我正在 xamarin 中开发一个连接到服务器的 android 应用程序。服务器应用程序根据客户端连接遵循流程等。但是,如果我说将设备转为飞行模式,然后关闭飞行模式,连接将不再有效。基本上在现实世界中,问题是用户将使用 android 设备,该设备可能会因 wifi 干扰等而导致短暂的连接丢失。我尝试了 "reconnect" 技术(正如我注意到 Tcp.Connected value was still true) 通过简单地尝试 reaqcuire NetworkStream 但是它没有工作。下面是代码:
public NetworkStream NetworkStream;
public TcpClient TcpClient;
public string LastGetData = null;
public string LastPostData = null;
public bool Disconnected = true;
public Stream InitializeStream(IPAddressAndPort ipObject)
{
NetworkStream clientStream = null;
try
{
IPAddress address = IPAddress.Parse(ipObject.Address);
TcpClient client = new TcpClient();
client.SendTimeout = 3000;
IPEndPoint serverEndPoint = new IPEndPoint(address, ipObject.Port);
client.ConnectAsync(serverEndPoint.Address, serverEndPoint.Port).Wait(5000);
if (client.Connected)
{
clientStream = client.GetStream();
TcpClient = client;
NetworkStream = clientStream;
Disconnected = false;
SendData("CLIENTSOFTWARENAME");
string initReturnValue = ReadData();
LastGetData = initReturnValue;
}
}
catch (Exception ex)
{
LastGetData = ex.Message;
}
return clientStream;
}
public void AttemptReconnect()
{
if (TcpClient != null)
{
try
{
if (TcpClient.Connected)
{
NetworkStream clientStream = TcpClient.GetStream();
NetworkStream = clientStream;
Disconnected = false;
}
}
catch (Exception ex)
{
LastGetData = ex.Message;
}
}
}
public string RunCommand(string dataToSend)
{
string returnValue = string.Empty;
try
{
if (Disconnected) AttemptReconnect();
SendData(dataToSend);
returnValue = ReadData();
if (returnValue == string.Empty)
Disconnected = true;
}
catch
{
returnValue = "An error occured during the action! Please logout and try again.";
}
return returnValue;
}
public void SendData(string dataToSend)
{
if (NetworkStream != null)
{
var serverStream = NetworkStream;
byte[] outStream = System.Text.Encoding.UTF8.GetBytes(dataToSend);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
LastPostData = dataToSend;
}
}
public string ReadData()
{
if (NetworkStream != null)
{
string returnValue = string.Empty;
byte[] bReads = new byte[1024];
int readAmount = 0;
DateTime endProcess = DateTime.Now.AddSeconds(20);
while (returnValue == string.Empty && endProcess > DateTime.Now)
{
while (NetworkStream.DataAvailable)
{
readAmount = NetworkStream.Read(bReads, 0, bReads.Length);
returnValue += string.Format("{0}", Encoding.UTF8.GetString(bReads, 0, readAmount));
}
}
LastGetData = returnValue;
return returnValue;
}
return null;
}
已解决:NetworkStream 或 TCPClient 一旦报错就没用了。我们决定存储有关设备的信息,以便重新连接到现有进程并创建新的 TCPClient 和 NetworkStream
我正在 xamarin 中开发一个连接到服务器的 android 应用程序。服务器应用程序根据客户端连接遵循流程等。但是,如果我说将设备转为飞行模式,然后关闭飞行模式,连接将不再有效。基本上在现实世界中,问题是用户将使用 android 设备,该设备可能会因 wifi 干扰等而导致短暂的连接丢失。我尝试了 "reconnect" 技术(正如我注意到 Tcp.Connected value was still true) 通过简单地尝试 reaqcuire NetworkStream 但是它没有工作。下面是代码:
public NetworkStream NetworkStream;
public TcpClient TcpClient;
public string LastGetData = null;
public string LastPostData = null;
public bool Disconnected = true;
public Stream InitializeStream(IPAddressAndPort ipObject)
{
NetworkStream clientStream = null;
try
{
IPAddress address = IPAddress.Parse(ipObject.Address);
TcpClient client = new TcpClient();
client.SendTimeout = 3000;
IPEndPoint serverEndPoint = new IPEndPoint(address, ipObject.Port);
client.ConnectAsync(serverEndPoint.Address, serverEndPoint.Port).Wait(5000);
if (client.Connected)
{
clientStream = client.GetStream();
TcpClient = client;
NetworkStream = clientStream;
Disconnected = false;
SendData("CLIENTSOFTWARENAME");
string initReturnValue = ReadData();
LastGetData = initReturnValue;
}
}
catch (Exception ex)
{
LastGetData = ex.Message;
}
return clientStream;
}
public void AttemptReconnect()
{
if (TcpClient != null)
{
try
{
if (TcpClient.Connected)
{
NetworkStream clientStream = TcpClient.GetStream();
NetworkStream = clientStream;
Disconnected = false;
}
}
catch (Exception ex)
{
LastGetData = ex.Message;
}
}
}
public string RunCommand(string dataToSend)
{
string returnValue = string.Empty;
try
{
if (Disconnected) AttemptReconnect();
SendData(dataToSend);
returnValue = ReadData();
if (returnValue == string.Empty)
Disconnected = true;
}
catch
{
returnValue = "An error occured during the action! Please logout and try again.";
}
return returnValue;
}
public void SendData(string dataToSend)
{
if (NetworkStream != null)
{
var serverStream = NetworkStream;
byte[] outStream = System.Text.Encoding.UTF8.GetBytes(dataToSend);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
LastPostData = dataToSend;
}
}
public string ReadData()
{
if (NetworkStream != null)
{
string returnValue = string.Empty;
byte[] bReads = new byte[1024];
int readAmount = 0;
DateTime endProcess = DateTime.Now.AddSeconds(20);
while (returnValue == string.Empty && endProcess > DateTime.Now)
{
while (NetworkStream.DataAvailable)
{
readAmount = NetworkStream.Read(bReads, 0, bReads.Length);
returnValue += string.Format("{0}", Encoding.UTF8.GetString(bReads, 0, readAmount));
}
}
LastGetData = returnValue;
return returnValue;
}
return null;
}
已解决:NetworkStream 或 TCPClient 一旦报错就没用了。我们决定存储有关设备的信息,以便重新连接到现有进程并创建新的 TCPClient 和 NetworkStream