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