TCP-сервер и клиент одновременно - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь создать пример блокчейна, где все клиенты работают как сервер и клиент одновременно. У меня есть поток, который постоянно прослушивает входящие соединения, и когда клиент принимается, он создает поток, который читает входящие данные и также отправляет данные. Он работает в одном направлении, например, если запущен только один сервер, и я присоединяюсь к нему как клиент, но, например, я хочу запустить 3 экземпляра и запустить сервер на всех 3 из них, а затем я хочу подключиться к экземпляру 2 из экземпляра 1 и т. д. Это код для приема клиентов и функции хоста соединения:

TcpClient Join() 
        {
            int server_port = int.Parse(port.Text); 
            klient = new TcpClient(); 

            try
            {
                klient.Connect("localhost", server_port); 
                if (klient.Connected) //Če se poveže
                {
                    Console.WriteLine("Connected to server."); 
                    myNetworkStream = klient.GetStream();
                }
            }
            catch (Exception e)
            {
            }

            return klient;
        }
TcpListener Host()
        {
            int port = FreeTcpPort();
            IPAddress ip_address = IPAddress.Parse("127.0.0.1"); //parsing ipja
            TcpListener host = new TcpListener(ip_address, port);//ustvari listener
            label1.Text = port.ToString();
            try
            {
                host.Start();//zagon strežnika
                Console.WriteLine("Server started..."); 
                mine_button.Enabled = true;
                Sprejemaj_cliente = new Thread(Cakaj_na_clienta); 
                Sprejemaj_cliente.Start(host); 
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString()); 
            }

            return host;
        }
public void Cakaj_na_clienta(object argument) 
        {
            TcpListener host = (TcpListener)argument; 
            try
            {
                while (true) //ČAKANJE NA POŠILJATELJA
                {
                    Console.WriteLine("Waiting for client...");
                    TcpClient client = host.AcceptTcpClient();
                    klient = client;
                    MessageBox.Show("Client connected");
                    string odjemalec_IP = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(); 
                    int odjemalec_PORT = ((IPEndPoint)client.Client.RemoteEndPoint).Port; 
                    Console.WriteLine("Povezal se je pošiljatelj na naslovu " + odjemalec_IP + ":" + odjemalec_PORT); //Zagon strežnika
                    myNetworkStream = klient.GetStream();
                    sync_thread = new Thread(Synchronize);  
                    sync_thread.Start();
                    send_chain = new Thread(Send_Chain);
                    send_chain.Start();

                }
            }
            catch (SocketException e)
            {
            }
        }
...