@Anton2001

Tcp чат, как исправить дубли?

Код сервера
private void serverThread()
        {
            var tcpListener = new TcpListener(IPAddress.Any, 8080);
            tcpListener.Start();
            while (true)
            {
                var tcpClient = tcpListener.AcceptTcpClient();

                Collections.listConnectedClients.Add(tcpClient);

                byte[] data = new byte[256];
                StringBuilder response = new StringBuilder();
                NetworkStream stream = tcpClient.GetStream();

                do
                {
                    int bytes = stream.Read(data, 0, data.Length);
                    response.Append(Encoding.Unicode.GetString(data, 0, bytes));
                }

                while (stream.DataAvailable);

                string ip = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString();

                string name = response.ToString();

                MessageBox.Show(name);

                this.Invoke((MethodInvoker)(() =>
                {
                    ListViewItem item = new ListViewItem(new string[] { ip,  name });
                    lvOnlineUser.Items.Add(item);
                }));
            }
        }


Код клиента (тестовый)
private void connect()
        {
            try
            {
                using (var tcpClient = new TcpClient())
                {
                    tcpClient.Connect(address, port);
                    while (true)
                    {
                        if (!IsConnected(tcpClient))
                        {
                            break;
                        }

                        NetworkStream stream = tcpClient.GetStream();
                        byte[] msg = System.Text.Encoding.Unicode.GetBytes("Alex");
                        stream.Write(msg, 0, msg.Length);

                    }
                    connect();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                connect();
            }
        }


Если сервер изначально был включён то имя доходит нормально но если сначала был включён клиент и только потом сервер то приходит n колл. дублей , пример "Alex AlexAlex ..."
Подскажите как исправить , с tcp опыта не было вообще . Нагуглить не смог , возможно не верно гуглил .
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 2
profesor08
@profesor08
Так закрой свой tcpClient, если он не подключился.
Ответ написан
@Anton2001 Автор вопроса
Вот так вроде работает как нужно но мне всё ещё кажется что я делаю не правильно
private void connect()
        {
            try
            {
                using (var tcpClient = new TcpClient())
                {
                    tcpClient.Connect(address, port);
                    SendName(tcpClient);
                    while (true)
                    {
                        if (!IsConnected(tcpClient))
                        {
                            tcpClient.Close();
                            connect();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                connect();
            }
        }
        private void SendName(TcpClient client)
        {
            NetworkStream stream = client.GetStream();
            byte[] msg = System.Text.Encoding.Unicode.GetBytes("Alex");
            if (IsConnected(client))
            {
                stream.Write(msg, 0, msg.Length);
            }
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы