2013-12-15 4 views
0

Я использую сокеты для создания приложения чата C#, где пользователи могут подключаться к одному пользователю, который размещает сервер, и отправлять ему сообщения.Создание приложения чата

Проблема в том, что: пока пользователи могут отправлять данные на сервер, а данные будут отображаться на сервере, данные НЕ будут отображаться другим пользователям, чьи клиенты подключены к серверу.

Текущий чат - это простая передача пакетов TCP-протокола. Единственная проблема - отправка данных обратно клиенту.

Итак, мой вопрос в том, как я могу сделать серверы широковещательными сообщениями для всех клиентов?

namespace Client 
{ 
    class Program 
    { 
     static Socket sck; 
     static void Main(string[] args) 
     { 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); 
      sck.Connect(localEndPoint); 
      Console.Write("Enter Text: "); 
      string text = Console.ReadLine(); 
      byte[] data = Encoding.ASCII.GetBytes(text); 
      sck.Send(data); 
      Main(args); 
     } 
    } 
} 

namespace Server 
{ 
    class Program 
    { 
     static byte[] Buffer { get; set; } 
     static byte[] formatted; 
     static Socket sck; 
     static void Main(string[] args) 
     { 
      listen(); 
     } 
     public static void listen() 
     { 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      sck.Bind(new IPEndPoint(0, 1234)); 
      sck.Listen(1); 

      Socket accepted = sck.Accept(); 
      Buffer = new byte[accepted.SendBufferSize]; 
      int bytesRead = accepted.Receive(Buffer); 
      formatted = new byte[bytesRead]; 
      for (int i = 0; i < bytesRead; i++) 
      { 
       formatted[i] = Buffer[i]; 
      } 
      string strData = Encoding.ASCII.GetString(formatted); 
      Console.Write(strData + "\r\n"); 
      sck.Close(); 
      accepted.Close(); 
      listen(); 
     } 
    } 
} 
+1

Вам нужно будет сохранить список подключенных клиентов, т. Е. «Список » или настраиваемую структуру, а затем выполнить итерацию по коллекции и «.Отправить» сообщение всем клиентам. –

+1

listen() рекурсивный? Это не закончится хорошо ... –

+0

@darren вам следует ответить на этот вопрос, а не комментировать, потому что ваш ответ правильный. – Liran

ответ

0

Слушание() прослушивает входящие запросы на соединение. На сервере вам нужно будет сохранить список подключений и распространять сообщения, которые он получил обратно на ожидающих клиентов в списке. На клиенте вам нужно будет настроить код для приема этих сообщений с помощью сокета, который вы использовали для подключения к серверу. Это два пути. http://msdn.microsoft.com/en-us/library/8s4y8aff(v=vs.110).aspx

EDIT:

Я предполагаю, что вы знаете, обратный вызов в вашей функции Main() не является хорошей практикой. Если вы этого не сделали, вам следует рассмотреть возможность использования цикла для начала и добавления некоторого триггера для выхода из цикла.

Смежные вопросы