我有一个用c#(4.5)开发的独立测试应用程序。 该应用程序主要用于将一些数据发送到COM端口。应用程序通过UI接受数据,相应的数据被发送到各自的COM端口。 例如:按下按钮时,文本框1中的数据进入COM 1,按下其他按钮等时,文本框2中的数据进入COM 2。
后来我不得不添加一个函数,其中必须通过Windows套接字接受不同的数据集,并且必须将其发送到除上述之外的其他COM端口。此侦听套接字可以从多个源接收数据。如果侦听套接字接收背对背套接字数据,则应用程序应该对数据进行排队并在先来先服务基础上处理数据。
因此我创建了一个同步套接字来接收数据。如果服务器从两个源接收数据,它将处理来自源1的数据并将完成状态发送到源1,然后从源2获取数据,处理它并通知状态,这将继续。套接字是在线程上创建的,因此它可以独立于UI接收和处理数据。
应用程序正在实现其目标,因为大多数通信是通过套接字进行的,并且人们并没有真正使用UI来输入数据。
最近,随着人们开始使用UI,我发现了一个全新的问题。当有人在套接字数据处理过程中尝试将数据输入UI时,它会停止套接字数据处理。当我在主机上按 ctrl + Alt + Del 时,它将恢复套接字数据的处理。
我无法在这里发现自己的错误。另外,我查看了Backgroundworkder类,但我不确定是否允许以同步方式处理套接字命令。
请将我视为新手,因为我仍在学习,复杂的建议可能难以消化。
public partial class frm_bot : Form
{
public frm_bot()
{
StartServer();
}
private void frm_bot_Load(object sender, EventArgs e)
{
try
{
myThread = new System.Threading.Thread(new System.Threading.ThreadStart(OnClientConnect));
myThread.IsBackground = true;
myThread.Start();
}
catch (Exception ex)
{
showErrorMsg(ex.Message);
}//catch
}
public void StartServer()
{
InitializeComponent();
System.Net.IPAddress localIPAddress = System.Net.IPAddress.Parse(GetlocalIp());
IPEndPoint ipLocal = new IPEndPoint(localIPAddress, 8089);
_listener = new TcpListener(ipLocal);
}
private void OnClientConnect()
{
try
{
_listener.Start();
TcpClient clientSocket = default(TcpClient);
clientSocket = _listener.AcceptTcpClient();
_clientSocket = clientSocket;
ReadCallback();
}
catch (Exception se)
{
MessageBox.Show("Could not bind to Port 8089! Please close all Applications that uses Port 8089");
}
}
public void ReadCallback()
{
try
{
using (StreamReader sr = new StreamReader(_clientSocket.GetStream()))
using (StreamWriter sw = new StreamWriter(_clientSocket.GetStream()))
{
sw.AutoFlush = true;
char[] c = null;
while (sr.Peek() >= 0)
{
c = new char[25];
sr.Read(c, 0, c.Length);
Console.WriteLine(c);
}
string d = new string(c);
string[] cmddata = d.Split('\0');
string dataFromClient = cmddata[0];
if (dataFromClient.Length == 0)
{
Console.WriteLine("Client sent empty string!");
}
else
{
ProcessSocketData(dataFromClient);
sw.Write("Done");
}
sw.Close();
}
OnClientConnect();
}
catch (Exception ex)
{
OnClientConnect();
return;
}
}
public void ProcessSocketData(string sockdata)
{
try
{
// Socket data is processed here.
}
catch (Exception ex)
{
MessageBox.Show("Exception on ProcessSocketData: " + ex.Message);
return;
}
}
}