Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
1

Клиент - Сервер. Вечное ожидание сообщения

04.12.2018, 14:40. Показов 2412. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Грубый набросок.


1)Первый случай

Клиент:
C#
1
2
3
  TcpClient client = new TcpClient();
  client.Connect("1.1.1.1",20000);
   client.Close();
На сервере получили сообщения в консоль
У нас клиент
Клиент вышел

2)
Клиент:
C#
1
2
3
4
  TcpClient client = new TcpClient();
  client.Connect("1.1.1.1",20000);
   // отключили интернет
   client.Close();
На сервере получили сообщения в консоль
У нас клиент

Сервер навечно будет ждать сообщение которого не будет.

Какими проверками можно определить что клиента уже нету?






Cервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public void Start()
        {
            Listener = new TcpListener(ip, Port);
            Listener.Start();
 
            while (true)
                ThreadPool.QueueUserWorkItem(ClientThread, Listener.AcceptTcpClient());
        }
        public void ClientThread(object StateInfo)
        {
            var tcpClient = StateInfo as TcpClient;
             new Client(tcpClient);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  public class Client
    {
        private NetworkStream stream;
        private TcpClient tcpClient;
 
        private Client(TcpClient client)
        {
            tcpClient = client;
            stream = client.GetStream();
            Console.WriteLine("У нас клиент");
            Read();
        }
     private void Read()
        {
            byte[] byffer = new byte[4096];
            byte[] byffer_length = new byte[4];
            int bytesRead;
            try
            {
                StringBuilder sb = new StringBuilder();
                stream.Read(byffer_length, 0, byffer_length.Length);
                int length = BitConverter.ToInt32(byffer_length, 0);
 
                while (lenght > 0)
                {
                    bytesRead = stream.Read(byffer, 0, byffer.Length);
                    sb.Append(Encoding.UTF8.GetString(byffer, 0, bytesRead));
                     length -= bytesRead;
                }
 
                Console.WriteLine("Сообщение клиента: "+ sb.ToString());
            }
            catch
            {
                stream.Close();
                tcpClient.Close();
                  Console.WriteLine("Клиент вышел");
            }
        }
     }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2018, 14:40
Ответы с готовыми решениями:

Клиент-сервер. Как в многопользовательском чате реализовать личные сообщения
Console.WriteLine(Func.ToDateTime() + "Server started."); TcpListener listener =...

Клиент-сервер: форма закрывается после второй отправки сообщения
В клиенте 2 формы. 1ая форма соединяется с сервером Создал класс Client cl.Start(IpTextBox.Text,...

Клиент-Сервер: приватные сообщения в чате
Добрый вечер форумчане. Делая приложения Клиент-Сервер на чистых сокетах, столкнулся с несколькими...

Сервер не принимает сообщения TCP или клиент не отправляет
Столкнулся с такой проблемой что программа клиента принимает сообщения TCP и делает всё правильно....

6
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.12.2018, 11:51  [ТС] 2
Решение: реализация heart bit или ping pong
0
Эксперт .NETАвтор FAQ
10411 / 5141 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.12.2018, 18:24 3
Defences,
Когда клиент отключается сам, метод Read возвращает пакет нулевой длины (то есть у вас будет bytesRead == 0). Это и является признаком отключения клиента.
Но в случае потери связи (обрыв интернета или что-то в этом духе), пакет нулевой длины скорее всего не придет. Для отслеживания таких случаев - да можно использовать heartbeat.
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.12.2018, 20:13  [ТС] 4
Storm23, изучаю tcp протокол, в локал хосте всегда 0 байт приходит. А вот если использовать реальную сеть, то увы по тестам очень редко приходит 0 байт и 2 часа или сколько там таймаут у Read клиент просто висит, если сделать 100 входов, то будет показываться что 100 пользователей обслуживается сервером, а на самом деле 1, другие 99 висят...

Возможно потому что для тестов я купил сервер в Азии, стабильность хромает, как раз то что нужно для тестов. Очень часто рвется соединение или искажаются пакеты(теряются)
0
Эксперт .NETАвтор FAQ
10411 / 5141 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.12.2018, 20:40 5
Цитата Сообщение от Defences Посмотреть сообщение
А вот если использовать реальную сеть, то увы по тестам очень редко приходит 0 байт
Вообще-то перед закрытием сокета нужно вызывать Socket.Shutdown. Именно этот метод отправляет нулевой пакет. По идее TcpClient.Close() должен сам вызывать Shutdown, но я не уверен. Можете попробовать вручную вызывать этот метод перед закрытием: tcpClient.Client.Shutdown()
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
06.12.2018, 00:12  [ТС] 6
Storm23, да, он работает отлично, он по Dispose вызывается как я понимаю, если даже просто закрыть программу он вызывается. Тут дело если пропал интернет, то никак не доставить. Поэтому самое лучшее решение heart beat
0
Эксперт .NET
1696 / 1325 / 316
Регистрация: 15.06.2012
Сообщений: 5,046
Записей в блоге: 3
12.12.2018, 14:52 7
https://docs.microsoft.com/ru-... work-4.7.2

Вообще Tcp 100% должен мониторить что соединение еще живо, и вроде кидать exception при его потере. Вопрос только в таймауте.
0
12.12.2018, 14:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2018, 14:52
Помогаю со студенческими работами здесь

Клиент-сервер. После каждой строки сообщения появляется символ
Добрый вечер. Делаю программку клиент- сервер. Представляет чат с зашифрованными сообщениями....

Клиент-сервер в один клик!(элемет сервер, клиент)
Вот решил поделиться с вами своей идеей и её реализацией. Всегда написание Сервера и Клиента к...

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

Вывод принятого сообщения (клиент-сервер)
Всем привет ! Делаю клиента. (для сервера) Проблема в том, что принятые сообщения не отображаются,...

winsock - клиент\сервер (теряется часть сообщения)
Доброго времени суток. Столкнулся с такой проблемкой: с клиента посылаю сообщение с текстом...

Сервер-клиент на сокетах: при отправке второго сообщения, программа падает
Сервер: uses Sockets, CRT; var Fromname: array of char; Buffer,oldbuff,buff,UN: string; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru