Чат на протоколе 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д