TCP服务器和客户端一次

时间:2020-01-12 11:31:23

标签: c# multithreading tcpclient tcplistener

我正在尝试创建一个区块链示例,其中所有客户端同时充当服务器和客户端。我有一个线程,该线程不断侦听传入的连接,当一个客户端被接受时,它会创建一个线程,该线程读取传入的数据并发送数据。它以一种方式工作,例如,如果仅启动一台服务器并且我以客户端身份加入该服务器,但是例如,我想启动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)
            {
            }
        }

0 个答案:

没有答案
相关问题