Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Defences
10 / 9 / 5
Регистрация: 28.12.2016
Сообщений: 191
1

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

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

Грубый набросок.


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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2018, 14:40
Ответы с готовыми решениями:

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

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

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что...

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

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

Возможно потому что для тестов я купил сервер в Азии, стабильность хромает, как раз то что нужно для тестов. Очень часто рвется соединение или искажаются пакеты(теряются)
0
Storm23
Эксперт .NETАвтор FAQ
7319 / 4310 / 1567
Регистрация: 11.01.2015
Сообщений: 5,558
Записей в блоге: 32
05.12.2018, 20:40 5
Цитата Сообщение от Defences Посмотреть сообщение
А вот если использовать реальную сеть, то увы по тестам очень редко приходит 0 байт
Вообще-то перед закрытием сокета нужно вызывать Socket.Shutdown. Именно этот метод отправляет нулевой пакет. По идее TcpClient.Close() должен сам вызывать Shutdown, но я не уверен. Можете попробовать вручную вызывать этот метод перед закрытием: tcpClient.Client.Shutdown()
0
Defences
10 / 9 / 5
Регистрация: 28.12.2016
Сообщений: 191
06.12.2018, 00:12  [ТС] 6
Storm23, да, он работает отлично, он по Dispose вызывается как я понимаю, если даже просто закрыть программу он вызывается. Тут дело если пропал интернет, то никак не доставить. Поэтому самое лучшее решение heart beat
0
Wolfdp
896 / 801 / 207
Регистрация: 15.06.2012
Сообщений: 3,164
Записей в блоге: 1
Завершенные тесты: 1
12.12.2018, 14:52 7
https://docs.microsoft.com/ru-ru/dot...ramework-4.7.2

Вообще Tcp 100% должен мониторить что соединение еще живо, и вроде кидать exception при его потере. Вопрос только в таймауте.
0
12.12.2018, 14:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2018, 14:52

Клиент-Сервер. Удалённый сервер
Всем здравствуйте. Я заинтересовался написать клиент-сервер приложение. Написал я отдельную...

TCP-сервер и TCP-клиент. Клиент не находит файл.
Всем привет! Решил изучать передачу данных по сети и начал с освоения примера, приведённого в...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru