powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Быстрая передача данных через Интернет
15 сообщений из 15, страница 1 из 1
Быстрая передача данных через Интернет
    #39743352
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Подскажите пожалуйста, правильно ли я делаю?

Задача: быстро передать данные (объект из 5 чисел типа int) из клиента на сервер через интернет.
Клиент генерирует эту передачу по событию taskbar_ValueChanged, перетаскивая посзунок, т е несколько раз в секунду. Но может и ничего не передавать несколько минут.
Сервер должен обработать каждую передачу и всегда быть наготове.

Я накидал такой "сервер":
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            int port = 13000;
            //IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            IPAddress localAddr = IPAddress.Parse("192.168.1.84");
            // TcpListener server = new TcpListener(port);
            TcpListener server = new TcpListener(localAddr, port);
            try
            {
                // Start listening for client requests.
                server.Start();
                int data;
                Byte[] bytes = new Byte[256];
                int prevValue = 0;
                while (true)
                {
                    TcpClient client = server.AcceptTcpClient();
                    NetworkStream stream = client.GetStream();
                    int i = stream.Read(bytes, 0, bytes.Length);
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        // Stop listening for new clients.
                        server.Stop();
                        return;
                    }
                    if (i <= 0)
                        continue;
                    data = int.Parse(System.Text.Encoding.UTF8.GetString(bytes, 0, i));
                    if (prevValue != data)
                    {
                        prevValue = data;
//ТУТ ОБРАБОТКА
                        worker.ReportProgress(50,prevValue);
                    }
                }
                // Perform a time consuming operation and report progress.
                //worker.ReportProgress(i * 10);
            }
            catch(Exception ex)
            {
                e.Cancel = true;
                //sw.Close();
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }

        }



Это работает, на скорость в тесте не жалуется, но в реальных условиях ещё не использовал.
Смущает, что
Код: c#
1.
2.
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();

делается в каждой итерации в цикле, а вынести не могу.

Может есть способ лучше? Или эта задача вообще делается по-другому?
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39743416
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МышЪ,

почему вынести не можешь?
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39743609
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subМышЪ,

почему вынести не можешь?

рука не поднимается
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39743622
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть, на сколько я понимаю, сервер принимает всё, что в него не положи.
По факту, я могу создать клиент, который пропихнет на ваш сервис данных на пару терабайт, он их либо сожрет, либо сдохнет.
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744675
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас активно выясняю, возможно всё-таки вынести можно.
Были быги, потому здесь много интересного). Сейчас активно читаю доки.

А вообще TcpClient подходит для этой задачи? Я по той дороге бегу?
Есть сомнения, потомо что одна из задач, это независимость сервера от состояния клиента.
Т е работа сервера в цикле не должна сильно зависеть от того, завис ли клиент, или клиент вообще выключен.
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744676
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesто есть, на сколько я понимаю, сервер принимает всё, что в него не положи.
По факту, я могу создать клиент, который пропихнет на ваш сервис данных на пару терабайт, он их либо сожрет, либо сдохнет.

Это временно, я ещё не определился со структурой передаваемых данных. Кстати, возможно это будет именно структура, не объект. Это тоже не очевидно.
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744684
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> TcpClient client = server.AcceptTcpClient();
Так уже не комильфо

Либо по старинке, через BeginAcceptTcpClient , либо через современные технологии и AcceptTcpClientAsync (неплохой пример )
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744779
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересный пример.
Только вот даже в нём в итогах автор пишет:
авторВ ситуациях, где клиент и сервер находятся в разных сетях, на первый план выходит вопрос безопасности, и в этом случае я всегда использую WCF.

Вот я и думаю, а может не TCPClient, а WCF?
Решающее значение -скорость выполнения (UDP не предлагать).

Туда ли я иду?
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744790
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополню.
Идеальная архитектура:
1- сервер создал подключение
2- клиент подключился- сервер аутентифицирует и авторизует клиента
3- клиент передаёт непрерывно- сервер обрабатывает непрерывно
4- клиент отрубился- серверу пофигу, он даже соединение не закрыл
5- клиент вернулся- сервер аутентифицирует и авторизует клиента, далее пункт 3

Также серверное приложение должно иметь UI, при чём модуль обработки запросов клиентов и серверный модуль UI общались между собой максимально быстро, без посредников (БД, файлы).
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744792
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744819
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МышЪДополню.
Идеальная архитектура:
1- сервер создал подключение
2- клиент подключился- сервер аутентифицирует и авторизует клиента
3- клиент передаёт непрерывно- сервер обрабатывает непрерывно
4- клиент отрубился- серверу пофигу, он даже соединение не закрыл
5- клиент вернулся- сервер аутентифицирует и авторизует клиента, далее пункт 3

Также серверное приложение должно иметь UI, при чём модуль обработки запросов клиентов и серверный модуль UI общались между собой максимально быстро, без посредников (БД, файлы).
Какие странные у вас идеалы

1. КЛИЕНТ создает подключение. А не сервер
4. Клиент отрубился, сервер ОТСЛЕДИЛ и ЗАКРЫЛ соединение, чтобы высвободить ресурсы.
5. Клиент вернулся, см. п.1

Серверное приложение НЕ ДОЛЖНО иметь UI. Это отдельная штука. Админка - это другой продукт.

Максимально быстро, но не UDP - это TCP (если на одной и той же машине, то shared memory или named pipes). И тут как раз WCF - это дополнительный тормоз.

Вообще WCF-ный nettcpbinging имеет смысл использовать, если и клиент и сервер будут точно на .net
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744827
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нейгла отключить для максимально быстрой доставки

правда если клиент мышью инициирует передачу аж до "нескольких раз в секунду" - спешить некуда
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744938
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

авторМаксимально быстро, но не UDP - это TCP (если на одной и той же машине, то shared memory или named pipes). И тут как раз WCF - это дополнительный тормоз.

Да, этого я и ждал. Спасибо).

авторНейгла отключить для максимально быстрой доставки
чего-чего отключить?
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39744971
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МышЪчего-чего отключить?
Алгоритм Нейгла
https://ru.m.wikipedia.org/wiki/Алгоритм_Нейгла
...
Рейтинг: 0 / 0
Быстрая передача данных через Интернет
    #39746289
МышЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо!
Вроде разобрался.
Про Нейгла, кстати события при движении мышью, это оказалось около 33мс, да пригодилось).

Я то вообще то думал, что поток байт он неприрывный, т е клиент с одной стороны пишет, а сервер с другой ОДНОВРЕМЕННО читает этот же поток, вот и не работало).
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Быстрая передача данных через Интернет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]