Запуск службы TCP сервера - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, не судите строго, собрал из разных частей небольшой TCP Сервер Сам код в консольном приложении работает, и службу без кода получается установить и стартануть... А вот всё вместе подвисает на старте службы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
 
namespace ADLogonServer
{
    public partial class Service1 : ServiceBase
    {
        public void AddLog(string log)
        {
            String AppName = "ADLogonServer";
            try
            {
                if (!EventLog.SourceExists(AppName))
                {
                    EventLog.CreateEventSource(AppName, AppName);
                }
                eventLog1.Source = AppName;
                eventLog1.WriteEntry(log);
            }
            catch { }
        }
 
        public Service1()
        {
            InitializeComponent();
        }
 
        protected override void OnStart(string[] args)
        {
            AddLog("Start");
            Server.sMain();
        }
 
        protected override void OnStop()
        {
            AddLog("Stop");
        }
    }

    class Client
    {
        private static void SQLInsert(string str)
        {
            String ConnStr = "Data Source=***;Initial Catalog=AD;Persist Security Info=True;User ID=ADLogonServer;Password=***";
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand command = new SqlCommand("INSERT INTO Test (fld1) VALUES ('" + str + "');", conn);
                command.Connection.Open();
                command.ExecuteNonQuery();
                command.Connection.Close();
            }
        }
 
        private void SendAnswer(TcpClient Client, string Str)
        {
            Str += "\r\n";
            byte[] Buffer = Encoding.UTF8.GetBytes(Str);
            Client.GetStream().Write(Buffer, 0, Buffer.Length);
            Client.Close();
        }
        public Client(TcpClient Client)
        {
            string Request = "";
            byte[] Buffer = new byte[1024];
            int Count;
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
            {
                Request += Encoding.UTF8.GetString(Buffer, 0, Count);
                if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; }
            }
            Console.WriteLine(Request);
            SQLInsert(Request);
            SendAnswer(Client, "OK");
            Client.Close();
        }
    }
 
    class Server
    {
        TcpListener Listener;
 
        public Server() // Старт сервера
        {
            Listener = new TcpListener(IPAddress.Any, 8000);
            Listener.Start();
 
            while (true)
            {
                // Принимаем новых клиентов. После того, как клиент был принят, он передается в новый поток (ClientThread) с использованием пула потоков.
                ThreadPool.QueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient());
            }
        }
 
        static void ClientThread(Object StateInfo)
        {
            // Просто создаем новый экземпляр класса Client и передаем ему приведенный к классу TcpClient объект StateInfo
            new Client((TcpClient)StateInfo);
        }
 
        ~Server() // Остановка сервера
        {
            if (Listener != null) { Listener.Stop(); }
        }
        public static void sMain()
        {
            // Максимальное количество потоков (по 4 на каждый процессор)
            int MaxThreadsCount = Environment.ProcessorCount * 4;
            // Установим максимальное количество рабочих потоков
            ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
            // Установим минимальное количество рабочих потоков
            ThreadPool.SetMinThreads(2, 2);
            // Создадим новый сервер
            new Server();
        }
 
    }
}
Если я правильно понимаю то дело в том что когда я запускаю, сервер уже начинает ждать клиентов, и старт становится бесконечным, но я никак не могу понять как тогда нужно запускать?

Решение задачи: «Запуск службы TCP сервера»

textual
Листинг программы
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Text;
using System.Threading;
 
namespace TspServerProcess
{
    public partial class Service1 : ServiceBase
    {
        //порт подключения
        int port = 1024;
        //слушатель
        TcpListener listaner;
        Thread clientThread;
        public Service1()
        {
            InitializeComponent();
        }
 
        protected override void OnStart(string[] args)
        {
            clientThread = new Thread(StartService);
            clientThread.Start();
        }
 
        protected override void OnStop()
        {
            StopService();
        }
 
        void StartService()
        {
            //Имя компьютера
            string myHost = Dns.GetHostName();
            //ip адрес типа IPAddress
            byte i = 0;
            //Определяем текущий ip v4 в формате **.**.**.**
            IPAddress myIP = Dns.GetHostEntry(myHost).AddressList[i];
            while (myIP.AddressFamily != AddressFamily.InterNetwork)
            {
                i++;
                myIP = Dns.GetHostEntry(myHost).AddressList[i];
            }
            try
            {
                //Старт слушателя
                listaner = new TcpListener(myIP, port);
                listaner.Start();
 
                //Отлавливаем все входящие подключения и запускаем их в отдельном потоке
                while (true)
                {
                    TcpClient client = listaner.AcceptTcpClient();
                    ClientObject clientObject = new ClientObject(client);
 
                    Thread clientThread = new Thread(clientObject.Process);
                    clientThread.Start();
                }
            }
            catch (Exception ex)
            {
                if (listaner != null)
                    listaner.Stop();
            }
            finally
            {
                if (listaner != null)
                    listaner.Stop();
            }
        }
 
        void StopService()
        {
            if (listaner != null)
                listaner.Stop();
            clientThread.Abort();
        }
    }
 
    
    class ClientObject
    {
       //метод этого класса запустится в отдельном потоке и будет индивидуально работать с подключенным клиентом
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5