C# Winforms, используя TcpListener Я не могу подключиться к серверу с других устройств в моей локальной сети - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть приложение Winforms, которое собирается передавать данные в приложение Android, сейчас оно принимает соединение и отображает строку текста в качестве вывода. Я тестировал на своей локальной машине команду te lnet в PowerShell, и она возвращает правильное сообщение. Когда я попробовал команду из другого P C в моей сети, он просто отключился и не может подключиться. Я удостоверился, что порт был свободен и что мой брандмауэр был выключен.

Вот мой метод:

 public void senddata()
 {
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;

            TcpListener server = null;
            try
            {
                Int32 port = 4296;
                IPAddress localAddr =IPAddress.Any;
                server = new TcpListener(localAddr, port);
                server.Start();

                Byte[] bytes = new Byte[256];

                while (true)
                {
                    server.Start();
                    Debug.WriteLine("Waiting for a connection... ");
                    TcpClient client = server.AcceptTcpClient();

                    NetworkStream stream = client.GetStream();

                    Debug.WriteLine("Connected!");
                    server.Stop();

                    while (stream.Read(bytes, 0, bytes.Length) != 0)
                    {
                        string data = "CPU: " + cpuCircle.Value + " C" + "        |         GPU: " + gpuCircle.Value + " C";
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                        stream.Flush();
                    }

                    client.Close();
                }
            }
            catch (SocketException m)
            {
                Debug.WriteLine("SocketException: "+m);
            }
            finally
            {
                server.Stop();
            }
        }).Start();
}

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 07 мая 2020

Я думаю, что главная проблема в том, что ваш объект слушателя создается в самом Thread, из-за которого только первый клиент может подключиться. Пожалуйста, сделайте объект TcpListener перед вызовом метода senddata (), и этот слушатель должен также принять соединение перед вызовом метода senddata () и передать объект клиента методу senddata (клиент TcpClient). Таким образом, вы сможете одновременно развлекать теоретически неограниченное количество клиентов:

Попробуйте:

void StackOverflow4() // Your calling method
    {
        TcpListener server = null;
        Int32 port = 4296;
        IPAddress localAddr = IPAddress.Any;
        try
        {
            server = new TcpListener(localAddr, port);
            server.Start();

            Byte[] bytes = new Byte[256];

            while (true)
            {                    
                Debug.WriteLine("Waiting for a connection... ");
                TcpClient client = server.AcceptTcpClient();
                senddata(client);
            }
        }
        catch (SocketException m)
        {
            Debug.WriteLine("SocketException: " + m);
            //Some logic to restart listner
        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.Message);
            //Some logic to restart listner
        }
    }


    public void senddata(TcpClient client)
    {
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;

           try
            {
                Byte[] bytes = new Byte[256];

                while (true)
                {
                    NetworkStream stream = client.GetStream();

                    Debug.WriteLine("Connected!");
                    //server.Stop();

                    while (stream.Read(bytes, 0, bytes.Length) != 0)
                    {
                        string data = "CPU: " + cpuCircle.Value + " C" + "        |         GPU: " + gpuCircle.Value + " C";
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                        stream.Flush();
                    }

                    client.Close();
                }
            }
            catch (SocketException m)
            {
                Debug.WriteLine("SocketException: " + m);
            }
            finally
            {
                //server.Stop();
            }
        }).Start();
    }
...