Чат на протоколе TCP - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток Пишу чат на протоколе TCP и столкнулся с такой проблемой: дублируется сообщение себе же... то есть я пишу, как клиент, сообщение - оно остается после написания и присылается себе же от сервера СКРИНШОТ как бы по простому обойти эту проблему?
namespace Server_Chat
{
    class Program
    {
        static TcpListener tcpListener; //монитор подключений TCP клиентов
        static Thread listenThread; //создание потока
 
        static List<TcpClient> clients = new List<TcpClient>(); //список клиентских подключений
        static List<NetworkStream> netStream = new List<NetworkStream>(); //список потока данных
 
        static void Main(string[] args)
        {
            
            try
            {
                Console.WriteLine("Server Started!");
                tcpListener = new TcpListener(IPAddress.Any, 8888);  
                listenThread = new Thread(new ThreadStart(ListenThread)); 
                listenThread.Start(); //старт потока
            }
            catch
            {
                Disconnect();
            }
        }
 
        static void ListenThread()
        {
            tcpListener.Start();
 
            while (true)
            {
                clients.Add(tcpListener.AcceptTcpClient()); //подключение пользователя
                netStream.Add(clients[clients.Count - 1].GetStream()); //обьект для получения данных
 
                Thread clientThread = new Thread(new ParameterizedThreadStart(ClientRecieve));
                clientThread.Start(clients.Count - 1);
            }
        }
 
        static void ClientRecieve(object ID)
        {
            int thisID = (int)ID;
 
            byte[] recieve = new byte[64];
 
            while (true)
            {
                try
                {
                    netStream[thisID].Read(recieve, 0, 64);
                }
                catch
                {
                    Console.WriteLine("Client with ID: " + thisID + " has Disconnected!");
                    break;
                }
                Console.WriteLine(thisID + " message: " + Encoding.ASCII.GetString(recieve));
                SendMessageToClients(recieve);
                for (int i = 0; i < 64; i++)
                {
                    recieve[i] = 0;
                }
            }
        }
 
        static void SendMessageToClients(byte[] toSend)
        {
            for (int i = 0; i < netStream.Count; i++)
            {
                netStream[i].Write(toSend, 0, 64); //передача данных
                netStream[i].Flush(); //удаление данных с потока
            }
        }
 
        static void Disconnect()
        {
            tcpListener.Stop(); //остановка чтения
 
            for (int i = 0; i < clients.Count; i++)
            {
                clients[i].Close(); //отключение клиента
                netStream[i].Close(); //отключение потока
            }
            Environment.Exit(0); //завершение процесса
        }
    }
}
namespace Chat_Client
{
    class Program
    {
        static string usr;
        static TcpClient client;
        static NetworkStream netStream;
 
        static void Main(string[] args)
        {
            Console.Write("User name: ");
            usr = Console.ReadLine();
            Console.Write("IP: ");
            string ip = Console.ReadLine();
            Console.Write("Port: ");
            int port = Convert.ToInt32(Console.ReadLine());
            Connect(ip, port);
        }
 
        static void Connect(string ip, int port)
        {
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), port); //IP с номером порта
            client = new TcpClient(); //подключение клиента
            try
            {
                client.Connect(ipe); 
                netStream = client.GetStream();
                Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveData));//получение данных
                receiveThread.Start();//старт потока
                Console.WriteLine("Connected!");
 
            }
            catch
            {
                Connect(ip, port);
            }
            SendMessage();
        }
 
        static void SendMessage()
        {
            Console.Write("Message: ");
            while (true)
            {
                try
                {
                    string message = usr + ": " + Console.ReadLine();
                    byte[] toSend = new byte[64];
                    toSend = Encoding.ASCII.GetBytes(message);
                    netStream.Write(toSend, 0, toSend.Length);
                    netStream.Flush(); //удаление данных из потока
                    //Console.WriteLine(message);
                    for (int i = 0; i < message.Length; i++)
                    {
                        toSend[i] = 0;
                    }
                }
                catch
                {
                    Console.WriteLine("ERROR");
                }
            }
        }
 
        static void ReceiveData(object e)
        {
            byte[] receiveMessage = new byte[64];
 
            while (true)
            {
                try
                {
                    netStream.Read(receiveMessage, 0, 64);//чтение сообщения
                }
                catch
                {
                    Console.WriteLine("The connection to the server was interrupted!"); //соединение было прервано
                    Console.ReadLine();
                    Disconnect();
                }
 
                string message = Encoding.ASCII.GetString(receiveMessage);
                Console.WriteLine(message);//вывод сообщения
            }
        }

        static void Disconnect()
        {
            client.Close();//отключение клиента
            netStream.Close();//отключение потока
            Environment.Exit(0); //завершение процесса
        }
    }
}

Решение задачи: «Чат на протоколе TCP»

textual
Листинг программы
 for (int i = 0; i < 64; i++)
                {
                    recieve[i] = 0;
                }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы