C # создайте многопоточный сервер сокетов и выберите клиент / соединение

#c# #multithreading #sockets

#c# #многопоточность #сокеты

Вопрос:

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

Ниже приведены 2 файла, один из которых представляет собой просто базовый стандартный файл Program.cs консольного приложения .NET Framework; другой — файл сервера. В сочетании они оба могут создать многопоточный сервер, но мне бы хотелось, чтобы он также позволял мне выбирать клиента для подключения на случай, если я создам приложение удаленного управления, как это сделал мой друг.

В качестве примечания я хотел бы поделиться тем, что я хочу иметь возможность подключаться к клиенту, войдя connect [1,2,3,etc..] в консоль.

Ответы

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

Код

Server.cs

 using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace TCPServer
{
    class Server
    {
        TcpListener server = null;
        int counter = 0;
        public Server(string ip, int port)
        {
            IPAddress localAddr = IPAddress.Parse(ip);
            server = new TcpListener(localAddr, port);
            server.Start();
            StartListener();
        }
        public void StartListener()
        {
            try
            {
                while (true)
                {
                    Console.WriteLine("Waiting for incoming connections...");
                    TcpClient client = server.AcceptTcpClient();
                    counter  = 1;
                    Console.WriteLine("Connected to authorized client: {0}", counter);
                    Thread t = new Thread(new ParameterizedThreadStart(HandleDeivce));
                    t.Start(client);
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
                server.Stop();
            }
        }
        public void HandleDeivce(Object obj)
        {
            TcpClient client = (TcpClient)obj;
            var stream = client.GetStream();
            string imei = String.Empty;
            string data = null;
            Byte[] bytes = new Byte[256];
            int i;
            try
            {
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    string hex = BitConverter.ToString(bytes);
                    data = Encoding.ASCII.GetString(bytes, 0, i);
                    Console.WriteLine("{1}: Received: {0}", data, Thread.CurrentThread.ManagedThreadId);
                    if (data != "auth token")
                    {
                        stream.Close();
                        client.Close();
                    }

                    string str = "Device authorization successfull";
                    Byte[] reply = System.Text.Encoding.ASCII.GetBytes(str);
                    stream.Write(reply, 0, reply.Length);
                    Console.WriteLine("{1}: Sent: {0}", str, Thread.CurrentThread.ManagedThreadId);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: {0}", e.ToString());
                client.Close();
            }
        }
    }
}
 

Program.cs

 using System;
using System.Threading;

namespace TCPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(delegate()
            {
                Server server = new Server("127.0.0.1", 13000);
            });
            thread.Start();

            Console.WriteLine("Server started...");
        }
    }
}
 

Комментарии:

1. Клиент / сервер имеет два значения в зависимости от того, находятся ли они на прикладном уровне или на уровне сокетов. Вы используете TCP, который является уровнем сокетов. С помощью TCL сначала должен быть запущен сервер (прослушиватель), а затем вы подключаете клиент к прослушивателю. В Net прослушиватель автоматически настраивается так, чтобы разрешить подключение нескольких клиентов. На прикладном уровне у вас может быть двухпортовый сервер, где один порт является слушателем, а другой — клиентом.

2. хорошо, как бы мне это реализовать? Я вроде как новичок в программировании сокетов на C #, однако, когда дело доходит до Python3 и Java, я в порядке.

3. Ваш IP-адрес клиента представляет собой строку, чтобы просто изменить строку на другой IP: сервер (строка ip, порт int). Вы опубликовали только код прослушивателя TCP, а не клиент.

4. Я понимаю это, но часть о размещении на 2 разных портах? я бы просто создал 2 экземпляра сервера, но с разными портами?

5. Это будет работать. Но обычно у вас будет один клиент и один сервер. Предположим, у вас есть служба, которая принимает запросы клиентов к базе данных. Вы должны запустить службу, открыв клиент для базы данных. Затем начните прослушивать запросы клиентов, подключающихся и обрабатывающих запросы.