Сетевая библиотека для C#

196
28 апреля 2018, 15:58

Хотелось бы найти сетевую библиотеку для C# TCP/IP для создания многопоточных серверов. Хотелось, чтобы передача данных осуществлялась с помощью пакетов. Можно было бы принимать данные как синхронно, так и асинхронно и работать с каждым клиентом отдельно. Также хотелось бы чтобы пакеты сериализовались в BSON или JSON.

Пробовал реализовать что-то свое, но получилось криво и почему-то пакеты иногда теряются и сбивается весь цикл чтения и парсинга пакетов. Для Java есть подобные библиотеки, а вот для .NET найти не могу. Спасибо за помощь!

Answer 1

Библиотек таких я лично не знаю. Возможно, они и есть, но толку от них было бы немного. Такие вещи реализуются самостоятельно. Используйте потоковые сокеты.

Создаёте Socket, привязываете к локальной конечной точке (метод Bind), указываете количество входящих соединений (метод Listen, -1 для неограниченного количества), принимаете входящие соединения и обрабатываете каждое в отдельном потоке. Что касается данных пакета, я думаю сами найдёте способ представления данных в нужном формате. Пусть будет метод, который перед отправкой всё вам завернёт в BSON или JSON, сериализует и пустит в сокет (десериализует при приёме).

Значит чат я бы на вашем месте организовал так:

  1. Идентифицировал бы клиента и заносил бы его в словарь сопоставляя его id ссылку на объект сокета
  2. При отправке сообщения, определял бы кому оно предназначено, вытаскивал бы сокет нужного пользователя из словаря по id и отправлял бы ему это сообщение
  3. В качестве словаря посоветую использовать асинхронные вещи, иначе будут проблемы

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

UPD: На счёт того, что вы теряете пакеты - да, это может быть (так уж устроены сокеты). Советую почитать спецификацию по winsock. Сам встречался с такой проблемой. Решил в итоге расширить размер входного буфера сокета (Socket.ReceiveBufferSize) и создать что-то типа своего буфера (отдельный поток, который читает все данные с сокета, как только они там появляются (Socket.Poll), и копирует в мой буфер - решение рабочее, но такое себе наверное (мне лень было тогда вникать)).

READ ALSO
Убрать анимацию у кнопки в Windows Phone 8.1

Убрать анимацию у кнопки в Windows Phone 8.1

В моём проекте есть объект Button следующего вида:

160
REST API с графическим интерфейсом

REST API с графическим интерфейсом

Пишу клиент-серверную системуДля управления сервером (включение, отключение, просмотр подключенных клиентов и т

160
Нужно переобразовать vbs в c# [требует правки]

Нужно переобразовать vbs в c# [требует правки]

Пример входных и выходных данных

180
Фильтрация GPS данных

Фильтрация GPS данных

К примеру, на сырых данных GPS'а с телефона (компьютера, да с чего угодно) - я еду где-то по реке, но на самом деле - на мосту через эту реку, в метрах...

198