背景
我正在尝试在移动设备上创建一个TCP侦听器来响应来自服务器应用程序的TCP消息请求。出于测试目的,我让应用程序响应以"回复"开头的消息。并将简单地用当前时间发回一条消息并关闭。
问题
少数设备将停止响应消息请求,这让我觉得我尝试在设备上接收TCP消息的方法有问题。我已经运行测试,我有服务器应用程序发送TCP消息,而设备漫游不同的无线接入点,它将始终在我的测试期间恢复完美。我认为设备接收消息的方式存在问题。
public void Receiver(int port)
{
Thread ct = new Thread(
new ThreadStart(
delegate()
{
// Create the listener and start it
TcpListener listener = new TcpListener(port);
listener.Start();
// Main listen loop
while (true)
{
// Try to connect client
try
{
TcpClient client = listener.AcceptTcpClient();
client.NoDelay = true;
// Get the client stream
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());
// Decode the TCP message
try
{
string request = sr.ReadLine();
if (request.StartsWith("reply"))
{
sw.WriteLine("reply|");
sw.WriteLine("time" + DateTime.Now.ToString());
sw.Flush();
sw.Close();
sr.Close();
}
}
catch (Exception exc)
{
if (client.Client.Connected == true)
{
client.Close();
listener.Stop();
listener.Start();
}
}
client.Close();
}
catch (Exception)
{
}
}
}));
ct.IsBackground = true;
ct.Start();
}
public void SendMessage(string ip_address, string port, string message)
{
// Variables
string request = "";
try
{
TcpClient Client = new TcpClient();
Client = new TcpClient(ip_address, Convert.ToInt32(port));
Client.NoDelay = true;
Client.ReceiveTimeout = 1000;
Client.SendTimeout = 1000;
StreamWriter Writer = new StreamWriter(Client.GetStream());
StreamReader sr = new StreamReader(Client.GetStream());
Writer.WriteLine(message);
Writer.Flush();
request = sr.ReadToEnd();
new_message = request;
//Close Connection
Client.Close();
Writer.Close();
sr.Close();
}
catch (Exception exc)
{
}
}
我知道在某些时候它会停止侦听该端口并丢弃一个错误站,机器主动拒绝连接。
"服务器"现在的代码简单地由Receiver(9000)调用。它还将创建一个后台线程,该后台线程将在" TcpClient client = listener.AcceptTcpClient();" 。
当我使用"客户端"用于发送服务器代码将运行的TCP消息的代码,并等待另一次连接尝试。
我在使用两个台式机的模拟中使用了此代码,其中设置了以下内容。
PC1(服务器) - 它只是等待它收到消息并快速响应,关闭连接,并等待另一个连接
PC2(客户端) - 重复发送消息,接收响应消息并关闭连接。
考虑到这个测试,我已经运行了一个多星期没有问题。我甚至在没有问题的情况下使用停靠在电源上的设备运行相同的测试。所以我的想法是,由于设备处于无线环境中,因此需要能够从断开连接中恢复。所以我想我的问题是,如果该设备失去无线功能并将其恢复,那么服务器将会恢复。能够正确恢复。我能想到的唯一另一件事就是以某种方式监视线程,如果失败则重新创建一个新的侦听器线程。