Как постоянно получать команды с сервера

Сразу скажу, что сокеты только начал изучать и вообще что связано с этим. Не исключаю, что здесь написан глупый код, буду рад поправкам.

Задача такая: необходимо удаленно отправлять команды на компьютер. Есть 3 файла - Server,Admin(с него мы отправляем команду на сервер), Client(принимает команду с сервера).

Server:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Server
{
    class Program
    {
        static int port = 8005; // порт для приема входящих запросов
        static void Main(string[] args)
        {
            // получаем адреса для запуска сокета
            IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);

            // создаем сокет
            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                // связываем сокет с локальной точкой, по которой будем принимать данные
                listenSocket.Bind(ipPoint);

                // начинаем прослушивание
                listenSocket.Listen(10);

                Console.WriteLine("Сервер запущен. Ожидание подключений...");

                while (true)
                {
                    Socket handler = listenSocket.Accept();
                    // получаем сообщение
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0; // количество полученных байтов
                    byte[] data = new byte[256]; // буфер для получаемых данных

                    do
                    {
                        bytes = handler.Receive(data);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (handler.Available > 0);

                    Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString());

                    // отправляем ответ
                    string message = "ваше сообщение доставлено";
                    data = Encoding.Unicode.GetBytes(message);
                    handler.Send(data); // Необходимо отправить всем клиентам, которые прослушивают сервер
                    // закрываем сокет
                   // handler.Shutdown(SocketShutdown.Both);
                    //handler.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

Admin:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace AdminServer
{
    class Program
    {
        // адрес и порт сервера, к которому будем подключаться
        static int port = 8005; // порт сервера
        static string address = "127.0.0.1"; // адрес сервера
        static void Main(string[] args)
        {
            try
            {
                IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);

                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // подключаемся к удаленному хосту
                socket.Connect(ipPoint);
                Console.Write("Введите сообщение:");
                string message = Console.ReadLine();
                byte[] data = Encoding.Unicode.GetBytes(message);
                socket.Send(data);

                // получаем ответ
                data = new byte[256]; // буфер для ответа
                StringBuilder builder = new StringBuilder();
                int bytes = 0; // количество полученных байт

                do
                {
                    bytes = socket.Receive(data, data.Length, 0);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (socket.Available > 0);
                Console.WriteLine("ответ сервера: " + builder.ToString());

                // закрываем сокет
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            //Console.Read();
        }
    }
}

Client:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace ClientServer
{
    class Program
    {
        static void disp() // запускаем диспетчер задач
        {
            Process.Start("taskmgr.exe");
        }
        // адрес и порт сервера, к которому будем подключаться
        static int port = 8005; // порт сервера
        static string address = "127.0.0.1"; // адрес сервера
        static void Main(string[] args)
        {
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect(address, port);

            NetworkStream Stream = tcpClient.GetStream();

            while (true)
            {

                //Читаем сообщение с сервера!
                StringBuilder builder = new StringBuilder();
                byte[] data = new byte[256];
                int bytes = Stream.Read(data, 0, data.Length); // получаем количество считанных байтов
                string message = Encoding.UTF8.GetString(data, 0, bytes);

                do
                {
                    bytes = Stream.Read(data, 0, data.Length);
                    builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }
                while (Stream.DataAvailable);

                if (builder.ToString() == "disp")
                {
                    disp();
                }
                Console.WriteLine(message);
                
            }

           



        }
    }
}

То как работают Admin и Server у меня вопросов нету, но Client не принимает команды.


Ответы (1 шт):

Автор решения: Blackmeser

Если я не ошибаюсь, ваш listenSocket.Accept(); работает в режиме строгой очереди.
socket.Available > 0 - может раньше закрыть соединение чем нужно, если допустим в буфере временно не будет данных.
Ваш Client, только читает данные, но не ожидает запрос входящих соединений, а ваш Server так-же начинает приём данных.

Советую вам остановиться и продумать условия переходов состояний от пункта к пункту внутри каждого приложения, т.к. то, что вы описали - оно не будет работать должным образом.
Как минимум - вынесите в отдельные функции каждый этап работы каждой вашей программы.

→ Ссылка