Чат на протоколе 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;
}