Я использую С# для разработки клиент-серверного приложения. Я все еще новичок, и я изучаю веревки С# и OO. Прямо сейчас, я написал на листе бумаги несколько идей. По сути, я бы создал класс "клиент", который содержит все детали (сокеты и т.д.). Класс клиента будет создан и сохранен в массиве, который будет использоваться сервером в цикле. Если подключено 100 клиентов, будет ли значительная память использоваться?
Я предполагаю, что сервер будет проходить через каждый клиент в массиве, проверяя флаг "dataSend", который затем будет помечать сервер для создания объекта NetworkStream для клиента.
Должен ли я создать объект сетевого потока при подключении клиента и закрыть соединение?
Если кто-нибудь может указать мне в сторону написания моего собственного клиент-серверного программного обеспечения, было бы оценено.
Cam, вы описали не совсем реальный дизайн клиент-сервер, так как обе стороны тесно связаны в вашем сценарии, разделяя массив объектов. Подумайте об этом вместо этого с точки зрения запросов и ответов. Клиент делает запрос на сервер по сети, и сервер возвращает ответ клиенту по сети. Они разделяют две вещи: общее сетевое соединение и знание интерфейса, который предоставляет сервер.
Веб - отличный, знакомый экземпляр этого шаблона. Клиент, ваш браузер, создает HTTP-запрос и отправляет его по сетевому соединению с сервером. Сервер интерпретирует запрос и отправляет HTTP-ответ клиенту. Каждый знает, как интерпретировать стандарт HTTP. Это связь между ними, больше ничего.
Я предлагаю начать с реализации очень простого запроса/ответа. Например, клиент отправляет запрос "ВРЕМЯ", и сервер отвечает с текущим временем, а запрос "DATE" отвечает на текущую дату. Имея простой протокол для реализации, вы можете сосредоточиться на изучении механики сетевых классов .NET.
Cam, нам нужно немного подробнее о том, чего вы пытаетесь достичь, чтобы дать вам действительно хороший ответ. Как правило, я предлагаю вам использовать WCF. Вам просто нужно создать сервис, определить интерфейс для своих операций, а затем, как многие клиенты могут использовать этот интерфейс по своему усмотрению. Это довольно легко на практике.
Массив клиентских классов, представляющих каждый клиент, подключенный к серверу, является хорошим способом справиться с этим. Вы также можете захотеть иметь класс-член, представляющий фактический сокет и сетевой код, который сохраняет его более чистым.
Pro tip: проверьте исходный код на некоторые MUD.
Что-то вроде этого было бы уместно: