Получение клиент-серверного чата для потоковой передачи списка онлайн-пользователей в C # - PullRequest
1 голос
/ 21 ноября 2011

Для школьного задания мы должны создать программу чата клиент-сервер на C #. Раньше я никогда не общался в сети, поэтому это меня очень смущает. Я прочитал книгу о сетевом взаимодействии на C # и смог создать очень простой чат, который работает с использованием двоичных устройств чтения и записи и сокета TCP. Однако для назначения я должен сделать список клиентов всех подключенных пользователей. Теперь, как бы я сделал так, чтобы клиент считывал поток только для списка, когда кто-то отключается или подключается к серверу. Я мог бы сделать так, чтобы клиенты всегда загружали новый список, но я чувствую, что отправляется много избыточных данных.

Кстати, я запутался в том, что клиент / сервер знает, что представляют собой данные в потоке. Пока у меня есть только строка, которая отправляется через поток, который представляет сообщение. Есть ли способ прикрепить какую-либо подпись или что-то к отправляемым данным, чтобы сервер или клиент знали, что эти конкретные данные - это имя пользователя или, возможно, сообщение для отображения.

Edit: У меня проблемы с потоком. У меня есть метод, который работает в своем собственном потоке, который всегда проверяет отправляемую информацию. Это список для строки, которая является сообщением для отображения сообщения, и для списка, содержащего подключенных пользователей. Проблема в том, что порядок отправки данных не всегда в согласованном порядке. Иногда сообщение является первым, другие - списком, а иногда - единственным сообщением в потоке. Есть ли способ сказать, какие данные читаются? Вот мой слушатель на стороне клиента.

private void incoming()
    {
        while (true)
        {
            try
            {
                string read = reader.ReadString();
                if (read.Length > 0)
                    lbOutput.Items.Add(read);
                    lbUsers.Items.Clear();

                List<string> users = (List<string>)binaryFormatter.Deserialize(stream);
                foreach (string user in users)
                    lbUsers.Items.Add(user.ToString());
            }
            catch { lbOutput.Items.Add("Error reading the stream"); }
        }

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Поскольку вы сказали, что это должно быть клиент-серверное приложение, я бы подошел к этому, используя WCF с дуплексным связыванием. Это позволяет службе отправлять сообщения обратно клиенту, а не просто получать их (что-то вроде событий).

Объяснение можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms731064.aspx

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

http://www.codeproject.com/KB/WCF/Chat_application_using_WC.aspx

0 голосов
/ 21 ноября 2011

Когда подключается новый клиент, он должен отправить на сервер сообщение, информирующее его о подключении, и попросить сохранить его имя. Затем сервер может передать сообщение всем другим клиентам с новым списком (или только именем нового клиента). Грубый контур:

public class Server {

     public void StartAcceptingConnections() {

          while(true) {
              // accept socket connection
              // read new user name
              foreach(Client cl in connectedClients) {
                  // send new user name to cl.Socket
              }    
          }             
     }
}

Параллельно вы получаете сообщения от клиентов для маршрутизации (я полагаю). Когда клиент уходит, он снова отправляет сообщение о разъединении, и сервер может передать изменение остальным клиентам.

Если вы хотите работать не только с байтами и строками, вы можете попытаться отправить весь объект путем сериализации. Взгляните на этот урок: http://msdn.microsoft.com/en-us/magazine/cc301761.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...