Запуск службы 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 { //метод этого класса запустится в отдельном потоке и будет индивидуально работать с подключенным клиентом } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д