static void Main(string[] args) { // Создадим новый сервер на порту 8080 MyClass Port = new MyClass(); if (Port.GetStatusPort() == true) new Server(8082, Port); }
static void ClientThread(Object StateInfo, MyClass PortOpen) { // Просто создаем новый экземпляр класса Client и передаем ему приведенный к классу TcpClient объект StateInfo new Client((TcpClient)StateInfo, PortOpen); }
TcpListener Listener; // Объект, принимающий TCP-клиентов // Запуск сервера public Server(int Port, MyClass PortOpen) { IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; Console.WriteLine("Host name PC: {0}:{1}", ipHostInfo.AddressList[0], Port); Listener = new TcpListener(ipAddress, Port); // Создаем "слушателя" для указанного порта Listener.Start(); // Запускаем его int index = 0; // В бесконечном цикле while (true) { // Принимаем нового клиента try { TcpClient Client = Listener.AcceptTcpClient(); if (Client != null) { Console.WriteLine("New Connect... {0}", index); index++; ClientThread(Client, PortOpen); } } catch(InvalidOperationException) {} catch(SocketException) {} } }
// Конструктор класса. Ему нужно передавать принятого клиента от TcpListener public Client(TcpClient Client, MyClass ComPort) { // Объявим строку, в которой будет хранится запрос клиента string Request = ""; // Буфер для хранения принятых от клиента данных byte[] Buffer = new byte[1024]; // Переменная для хранения количества байт, принятых от клиента int Count; try { // Читаем из потока клиента до тех пор, пока от него поступают данные if ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { // Преобразуем эти данные в строку и добавим ее к переменной Request Request += Encoding.ASCII.GetString(Buffer, 0, 50); // Запрос должен обрываться последовательностью \r\n\r\n // Либо обрываем прием данных сами, если длина строки Request превышает 4 килобайта // Нам не нужно получать данные из POST-запроса (и т. п.), а обычный запрос // по идее не должен быть больше 4 килобайт //if (Request.Contains("@") == true) //{ // Console.WriteLine("Index @: {0}", Request.IndexOf("@")); // break; //} } } catch (IOException) { } int index = -1; int ID = 0; double pr; byte[] Buffer2 = new byte[50]; String massage = ""; Console.WriteLine(Request); if (Request.Contains("@id=") == true) { index = Request.IndexOf("@id="); pr = char.GetNumericValue(Request[index + 4]); ID = Convert.ToInt32(pr); switch (ID) { //case 0: // massage = "Bad Request."; // break; //case 1: // massage = ComPort.GetWeight(); // break; //case 2: // massage = ComPort.GetStateOfWeight(0); // break; //case 3: // massage = ComPort.RemoveIncludeWeight(); // break; default: massage = "ERROR!!!"; break; } } else massage = "Bad Request."; Buffer2 = Encoding.ASCII.GetBytes(massage); Console.WriteLine(massage); // Отправим его клиенту try { Client.GetStream().Write(Buffer2, 0, Buffer2.Length); Client.Close(); } catch (IOException) { } }
public Server(int portTCP, MyClass PortOpenNew) { IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; Console.WriteLine("Host name my PC: {0}:{1} \n<<---------------------------------------->>", ipHostInfo.AddressList[0], portTCP); Listener = new TcpListener(ipAddress, portTCP); // Создаем "слушателя" для указанного порта try { Listener.Start(); // start listener // hide console window ToggleWindow(false); // создаем контекстное меню ContextMenu TrayMenu = new ContextMenu(); TrayMenu.MenuItems.Add("Показать/спрятать консоль", TrayToggle); TrayMenu.MenuItems.Add("Перезапустить сервер ваг", RestartServer); TrayMenu.MenuItems.Add("Выход", OnExit); TrayIcon = new NotifyIcon(); TrayIcon.ContextMenu = TrayMenu; // registering context menu TrayIcon.Icon = new System.Drawing.Icon("server.ico"); TrayIcon.Visible = true; TrayIcon.Text = "Сервер ваг работает. Порт: " + portTCP; TrayIcon.MouseDoubleClick += new MouseEventHandler(TrayClick); // show/hide console window double click TrayIcon.ShowBalloonTip(2000, "Сервер ваг", "Сервер ваг успешно запущен и работает!", ToolTipIcon.Info); System.Threading.Thread.Sleep(2000); //createing timer for start listener TrayTimer = new System.Timers.Timer(); TrayTimer.Interval = 100; TrayTimer.Enabled = true; TrayTimer.Elapsed += new System.Timers.ElapsedEventHandler(StartListener); // основная функция консоли PortOpen = PortOpenNew; Application.Run(); } catch (Exception e) { return; } }
// Конструктор класса. Ему нужно передавать принятого клиента от TcpListener public Client(TcpClient Client, MyClass ComPort) { string Request = ""; // string for questions from client byte[] Buffer = new byte[1024]; // buff for questions from client int Count; // number send bytes from client try { // read data from stream if ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { // convert data into string Request += Encoding.ASCII.GetString(Buffer, 0, 50); } } catch (IOException) { } int index = -1; int ID = 0; double pr; byte[] Buffer2 = new byte[50]; String massage = ""; if (Request.Contains("?id=") == true) { Console.WriteLine("" + Client.Client.RemoteEndPoint.ToString() + "\n" + Request); index = Request.IndexOf("?id="); pr = char.GetNumericValue(Request[index + 4]); ID = Convert.ToInt32(pr); switch (ID) { case 0: massage = "Bad Request."; break; case 1: massage = ComPort.GetWeight(); break; case 2: massage = ComPort.GetStateOfWeight(); break; case 3: massage = ComPort.RemoveIncludeWeight(); break; default: massage = "ERROR!!!"; break; } Buffer2 = Encoding.ASCII.GetBytes(massage); Console.WriteLine(massage + "\n<<----------------------------------------->>\n"); } //else // massage = "Bad Request."; try { //sending answer to client Client.GetStream().Write(Buffer2, 0, Buffer2.Length); Client.Close(); } catch (IOException) { } }