Я пытаюсь создать приложение для отслеживания работы, и я хочу, чтобы оно было там, где работодатель может заблокировать приложение, и приложение блокируется на всех компьютерах сотрудника одновременно. Вот код, который у меня есть для сервера:
private void btnStart_Click(object sender, EventArgs e)
{
// Start listening for TCP connections:
listener = new TcpListener(IPAddress.Any, int.Parse(txtServerPort.Text));
listener.Start();
lbChat.Items.Add($"Server started on IP: {displayIP} and Port: {txtServerPort.Text}");
isStarted = true;
Server.RunWorkerAsync();
}
private void Server_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
TcpClient client = listener.AcceptTcpClient();
clientList.Add(client);
foreach(TcpClient tcp in clientList)
{
STR = new StreamReader(tcp.GetStream());
STW = new StreamWriter(tcp.GetStream());
STW.AutoFlush = true;
}
if(!backgroundWorker1.IsBusy & !backgroundWorker2.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.WorkerSupportsCancellation = true;
}
}
}
// Recieve messages from the employee's computer:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
foreach(TcpClient tcp in clientList)
{
while (tcp.Connected)
{
try
{
recieve = STR.ReadLine();
this.lbChat.Invoke(new MethodInvoker(delegate ()
{
lbChat.Items.Add(recieve + "\n");
if (recieve.Contains(">"))
{
// Add employee name to connected list:
string name = recieve.Split(new string[] { "'" }, StringSplitOptions.None)[1].Split('\'')[0].Trim();
employeesList.Add(name);
lbConnected.Items.Add(name);
}
else if (recieve.Contains("<"))
{
string name = recieve.Split(new string[] { "'" }, StringSplitOptions.None)[1].Split('\'')[0].Trim();
employeesList.Remove(name);
lbConnected.Items.Clear();
foreach (string employee in employeesList)
{
lbConnected.Items.Add(employee);
}
}
}));
recieve = "";
}
catch (Exception ex)
{
Console.Write(ex.Message.ToString());
}
}
}
}
// Send messages to employee's computer:
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
foreach(TcpClient tcp in clientList)
{
if (tcp.Connected)
{
STW.WriteLine(TextToSend);
}
else
{
MessageBox.Show("Sending failed");
}
}
}
В основном происходит то, что сервер получит уведомление о том, что первый клиент подключился, однако он не получит это уведомление от второго клиента, который подключается, однако только второй клиент получает и отправляет уведомления после подключения, а первый клиент нет. Однако если я сначала отключу первый клиент, сервер получит уведомление о том, что первый клиент отключился, а затем он также получит уведомление, когда второй отключится. Однако если я сначала отключу второго клиента, сервер не будет проинформирован об этом. Так что я действительно не уверен, что делать со всем этим.