Почему не приходят сообщения?
Разбираю многопользовательский чат
Запускается сервер, клиент.
На клиенте пишется сообщение, оно отправляется на сервер и от туда сервер рассылает всем юзерам которые до этого писали.
но если я отправляю сообщение не из Console.ReadLine() а сам в переменную(message:34) вписываю текст то сообщения отправляются но не рассылаются, почему так может происходить?
Клиент:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace UDP_CHAT_CLIENT
{
class Program
{
static int remotePort = Int32.Parse("3000"); // Порт для отправки сообщений
static IPAddress ipAddress = IPAddress.Parse("Тут мой белый IP, на роутере за ранее расшарил порт"); // IP адрес сервера
static Socket listeningSocket; // Сокет
static void Main(string[] args)
{
Console.WriteLine("╔═══════════════════════════════════════════════════════════╗");
Console.WriteLine("║ Chat Started! ║");
Console.WriteLine("╚═══════════════════════════════════════════════════════════╝");
//Console.Write("Введите ip адрес получателя: ");
//ipAddress = IPAddress.Parse("91.123.83.107");
//Console.Write("Введите порт для отправки сообщений: ");
//remotePort = Int32.Parse("3000");
Console.WriteLine("Подключение к серверу...");
//Console.WriteLine();
listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // Создание сокета
Task listeningTask = new Task(Listen); // Создание потока
listeningTask.Start(); // Запуск потока
while (true) // Отправление сообщений серверу в бесконечном цикле
{
string message = Console.ReadLine();
//string message = "test";
byte[] data = Encoding.Unicode.GetBytes(message);
EndPoint remotePoint = new IPEndPoint(ipAddress, remotePort);
listeningSocket.SendTo(data, remotePoint);
}
}
// Поток для приема подключений
private static void Listen()
{
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); // Прослушиваем по адресу
listeningSocket.Bind(localIP);
while (true)
{
StringBuilder builder = new StringBuilder();
int bytes = 0;
byte[] data = new byte[256];
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
do
{
bytes = listeningSocket.ReceiveFrom(data, ref remoteIp);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (listeningSocket.Available > 0);
IPEndPoint remoteFullIp = remoteIp as IPEndPoint;
if (builder.ToString() == "ConnectPing")
{
Console.WriteLine("Подключение к серверу установлено.");
Console.WriteLine("Для отправки сообщений введите сообщение и нажмите Enter");
Console.WriteLine();
}
else
{
Console.WriteLine("{0}:{1} - {2}", remoteFullIp.Address.ToString(), remoteFullIp.Port, builder.ToString());
}
}
}
// закрытие сокета
private static void Close()
{
if (listeningSocket != null)
{
listeningSocket.Shutdown(SocketShutdown.Both);
listeningSocket.Close();
listeningSocket = null;
}
Console.WriteLine("Сервер остановлен!");
}
}
}
Сервер:
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace UDP_CHAT_SERVER
{
class Program
{
static int localPort = 3000; // порт приема сообщений
static Socket listeningSocket; // Сокет
static List<IPEndPoint> clients = new List<IPEndPoint>(); // Список "подключенных" клиентов
static void Main(string[] args)
{
Console.WriteLine(@"************************************************************************************");
Console.WriteLine(@"* _____ _____ __ __ __ *");
Console.WriteLine(@"* / ___/___ ______ _____ _____ / ___// /_____ ______/ /____ ____/ / *");
Console.WriteLine(@"* \__ \/ _ \/ ___/ | / / _ \/ ___/ \__ \/ __/ __ `/ ___/ __/ _ \/ __ / *");
Console.WriteLine(@"* ___/ / __/ / | |/ / __/ / ___/ / /_/ /_/ / / / /_/ __/ /_/ / *");
Console.WriteLine(@"* /____/\___/_/ |___/\___/_/ /____/\__/\__,_/_/ \__/\___/\__,_/ *");
Console.WriteLine(@"* *");
Console.WriteLine(@"************************************************************************************");
//Console.Write("Введите порт для приема сообщений: ");
//localPort = Int32.Parse(Console.ReadLine());
//Console.WriteLine();
try
{
listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // Создание сокета
Task listeningTask = new Task(Listen); // Создание потока для получения сообщений
listeningTask.Start(); // Запуск потока
listeningTask.Wait(); // Не идем дальше пока поток не будет остановлен
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Close(); // Закрываем сокет
}
}
// поток для приема подключений
private static void Listen()
{
try
{
//Прослушиваем по адресу
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), localPort);
listeningSocket.Bind(localIP);
while (true)
{
StringBuilder builder = new StringBuilder(); // получаем сообщение
int bytes = 0; // количество полученных байтов
byte[] data = new byte[256]; // буфер для получаемых данных
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0); //адрес, с которого пришли данные
do
{
bytes = listeningSocket.ReceiveFrom(data, ref remoteIp);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (listeningSocket.Available > 0);
IPEndPoint remoteFullIp = remoteIp as IPEndPoint; // получаем данные о подключении
Console.WriteLine("{0}:{1} - {2}", remoteFullIp.Address.ToString(), remoteFullIp.Port, builder.ToString()); // выводим сообщение
bool addClient = true; // Переменная для определения нового пользователя
for (int i = 0; i < clients.Count; i++) // Циклом перебераем всех пользователей которые отправляли сообщения на сервер
if (clients[i].Address.ToString() == remoteFullIp.Address.ToString()) // Если аддресс отправителя данного сообщения совпадает с аддрессом в списке
addClient = false; // Не добавляем клиента в историю
if (addClient == true) // Если этого отправителя не было обноруженно в истории
clients.Add(remoteFullIp); // Добавляем клиента в исторю
BroadcastMessage(builder.ToString(), remoteFullIp.Address.ToString()); // Рассылаем сообщения всем клиентам кроме самого отправителя
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Close();
}
}
// Метод для рассылки сообщений
private static void BroadcastMessage(string message, string ip)
{
Console.WriteLine("отправляю: "+message);
if (message != "ConnectPing")
{
Console.WriteLine("отправляю не коннект: " + message);
byte[] data = Encoding.Unicode.GetBytes(message); // Формируем байты из текста
for (int i = 0; i < clients.Count; i++) // Циклом перебераем всех клиентов
// if (clients[i].Address.ToString() != ip) // Если аддресс получателя не совпадает с аддрессом отправителя
listeningSocket.SendTo(data, clients[i]); // Отправляем сообщение
}
else
{
Console.WriteLine("отправляю коннект: " + message);
byte[] data = Encoding.Unicode.GetBytes(message); // Формируем байты из текста
for (int i = 0; i < clients.Count; i++) // Циклом перебераем всех клиентов
{
if (clients[i].Address.ToString() == ip) // Если аддресс получателя не совпадает с аддрессом отправителя
{
listeningSocket.SendTo(data, clients[i]);
Console.WriteLine("Отправляю на адрес : " + clients[i].ToString());
}
}
// Отправляем сообщение
}
}
// закрытие сокета
private static void Close()
{
if (listeningSocket != null)
{
listeningSocket.Shutdown(SocketShutdown.Both);
listeningSocket.Close();
listeningSocket = null;
}
Console.WriteLine("Сервер остановлен!");
}
}
}