Советы по проектированию сервера сокетов - PullRequest
1 голос
/ 30 марта 2010

Мы пишем сокет-сервер на c # и нам нужен совет по дизайну.

Справочная информация: клиенты (с мобильных устройств) подключаются к нашему серверному приложению, и мы оставляем их сокеты открытыми, чтобы мы могли отправлять им данные обратно в любое время, когда это необходимо. Объем данных варьируется, но мы обычно отправляем / получаем данные от каждого клиента каждые несколько секунд, поэтому он довольно интенсивный. Количество одновременных подключений может варьироваться от 50 до 500 (и более в будущем).

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

У нас есть коллекция, в которой хранятся состояния наших клиентов (на данный момент у нас нет пула сокетов / соединений, не так ли?).

Каждый раз, когда клиент подключается, мы создаем сокет, а затем ждем, пока он отправит нам некоторые данные, и в receiveCallBack мы добавляем его клиентское состояние в наш словарь соединений (как только мы проверим, кто они).

Когда клиентский объект затем завершает работу, мы закрываем его сокет, а затем закрываем его, а также удаляем их из нашей коллекции клиентского словаря.

Предположительно, все происходит в правильном порядке, все работает, как ожидалось.

Тем не менее, почти каждый день он перестает принимать соединения, или мы думаем, что это или он соединяется, но на самом деле ничего не делает после этого, и мы не можем понять, почему он просто останавливается.

Есть несколько вещей, в которых мы не уверены

1) Должны ли мы создавать какой-то пул соединений, а не просто словарь клиентских сокетов

2) Что происходит с сокетами, которые соединяются, но затем не добавляются в наш словарь, они просто остаются в памяти, ничего не делая, если мы создадим ДРУГОЙ словарь, который содержит сокеты, как только они будут созданы?

3) Как лучше всего выяснить, не подключены ли клиенты? Мы прочитали несколько методов, но не уверены, что лучше использовать, отправлять или читать данные, если да, то как?

4) Если мы перебираем диктонар подключений для проверки удаленных клиентов, должны ли мы блокировать словарь, если это так, как это влияет на объекты других клиентов, пытающихся использовать его одновременно, выдаст ли он ошибку или просто ждать?

5) Мы часто получаем disposedSocketException в методе ReceiveCallBack в случайные моменты времени, означает ли это, что мы можем безопасно удалить этот сокет из коллекции?

Похоже, мы не можем найти примеры производственных типов, которые бы демонстрировали какую-либо из этих работ.

Любой совет будет в значительной степени получен

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Есть хорошая статья о программировании сокетов в .NET Дарина Кили, которая, я думаю, отвечает на несколько ваших вопросов. Это дает хороший фон вместе с примерами реализации клиента и сервера.

0 голосов
/ 30 марта 2010

4) Да, заблокируйте его. Остальные темы просто должны ждать.

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

...