Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

socket отправляем 2 сообщения, приходит 1, содержащее оба

84K
13 августа 2012 года
Visage
1 / / 13.08.2012
Здравствуйте!
Я недавно начал изучать первый язык, поэтому кривлю как могу, но стараюсь писать программу сам, хотя и личу непонятные места у других похожих проектов.
Пишу простенький чатик (все это делали, наверное ;) ) и в рассылке юзеров у меня попалась проблема.
Вот этим кодом я рассылаю каждому сокету из хештейбла всех юзеров из листа:
Код:
foreach (Socket s_client in clients.Keys)
           {
               
               foreach (string user in users){
               string umsg ="U$"+user;
               byte[] msg = Encoding.UTF8.GetBytes(umsg);
               try
               {
                   s_client.Send(msg,msg.Length, SocketFlags.None);
               }
               catch { }}
               
           }
Принимает на стороне клиента:

Код:
while (isClientRunning)
                  {
                      try
                      {
                         
                          byte[] bytes = new byte[1024];
                          int i= client.Receive(bytes);
                          string data = Encoding.UTF8.GetString(bytes, 0, i);
                           rcvdData = data.Split(new Char[] { '$' });
                         
                          if (i > 0)
                          {
                              switcher();
                           
                          }
                         
                      }
                      catch { }
                  }
Дело в том, что foreach, как я понял, рассылает настолько быстро, что на клиент приходит 1 сообщение, вместо, допустим двух, но содержит оба сообщения. То есть сервер отправляет U$name1 и U$name2, клиент получает U$name1U$name2, все это делится неверно и дальше идет неправильно. В чем я ошибся или чего не знаю?
40K
13 августа 2012 года
D129
228 / / 18.04.2012
есть еще протокол оптимизации TCP, который не дает вам отправлять отдельные пакеты когда вам вздумается, они становятся в очередь и отправляются пачками. Для сети так быстрее.

Если вы хотите уйти от этого далеко и надолго - то изучайте сразу WCF.

там ваше "сообщение" будет нормальным классом, передаваемым - пересылаемым как параметр, и никакого самовольного "дайте две" - не будет.
:-)

В противном случае - вам надо в вашу строку вводить хотябы символы начала-завершения, и при чтении из сокета - ожидать получения потока, а не одного сообщения.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог