Подтвердить что ты не робот

Objective-C сеть - лучшие практики?

Я создаю приложение Objective-C, в котором есть как сервер, так и клиент. Клиент может отправлять обновления на сервер, и сервер должен иметь возможность отправлять обновления каждому подключенному клиенту. Я думал о том, как лучше всего реализовать эту систему, но я прошу ваших предложений.

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

Считаете ли вы, что эта система будет работать хорошо? Если да, есть ли у вас какие-либо предложения о том, как выполнять потоки? Какие классы NS вы можете указать мне? Должна быть какая-то очередь, которую я могу использовать, я думаю.

Любые другие мысли?

EDIT: я не ожидаю, что клиент посчитает, что он будет превышать 50 или около того, на максимальном уровне.

4b9b3361

Ответ 1

Пока клиент и сервер являются приложениями OS X и оба могут быть записаны в Objective-C с использованием фреймворков Cocoa, я настоятельно рекомендую вам взглянуть на Технология распределенных объектов (DO) в Cocoa. Я не буду пытаться дать учебник в Distributed Objects здесь, просто объясните, почему это может быть полезно...

DO обрабатывает данные асинхронной сети для вас (все ваши обновления клиента могут происходить в одном потоке). Кроме того, семантика связи с удаленным объектом (клиент к серверу или наоборот, DO двунаправленна после установления соединения) очень похожа на внутреннюю связь. Другими словами, если у вас есть ссылка на удаленный объект (действительно, NSDistantObject, который действует как прокси-сервер для объекта на другом конце соединения), ваш клиентский код может отправлять сообщения удаленному объекту, как если бы он был локальный:

[remoteServer update:client];

от клиента или

[[remoteClientList objectAtIndex:i] update:server];

с сервера. Я оставлю детали настройки соединения и получения ссылки на RemoteServer или remoteClient после чтения руководства Distributed Objects.

Недостатком использования DO является то, что вы привязаны к Cocoa; будет очень сложно написать клиент или сервер без Cocoa, который связывается с использованием Distirbuted Objects. Если есть вероятность, что вы захотите использовать не-w83 > клиентские или серверные реализации, вы не должны использовать DO. В этом случае я бы рекомендовал что-то простое с большим количеством межплатформенной и языковой поддержки. Хорошим вариантом является API-интерфейс REST-стиля через HTTP. Посмотрите документацию Cocoa Загрузка URL-адресов для информации о том, как реализовать HTTP-запросы и ответы. Посмотрите на пример кода CocoaHTTPServer или проект code.google.com одноименное имя для информации об использовании HTTP-сервера в коде Cocoa.

В качестве последнего варианта вы можете взглянуть на Cocoa Руководство по программированию потоков, если вы хотите реализовать свой собственный сетевой протокол, Подклассы NSStream позволят вам прослушивать сетевой сокет и обрабатывать асинхронные чтения/записи в/из этого сокета. Для этой цели многие люди используют AsyncSocket. Он обертывает (нижний уровень) CFStream и CFSocket и упрощает запись кода сети.

Ответ 2

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

Ответ 3

В стороне разработчика Apple есть несколько сетевых примеров. Один из них я бы рекомендовал вам проверить URLCache, который можно загрузить. Цитата из документации Apple для этого примера:

URLCache - это пример приложения iPhone, демонстрирующий, как загрузить ресурс из Интернета, сохранить его в каталоге данных приложения и использовать локальную копию ресурса. URLCache также демонстрирует, как реализовать пару политик кэширования:

Ответ 4

Интересным вариантом является протокол BLIP из Jens Alfke. Это как урезанная версия BEEP: система, ориентированная на сообщения. Он в основном обеспечивает низкоуровневые абстракции для двунаправленного канала сообщений, поэтому вы можете сосредоточиться на разделении своего протокола связи поверх него.

В нем есть некоторые достойные последователи, такие как Marcus Zarra (автор библии CoreData) и Gus Mueller программного обеспечения Flying Meat.

Ответ 5

Я не знаю, как вы планируете проектировать свою систему, но обычно сервер не может подключиться к клиенту; клиент должен инициировать сообщение. При низком лимите 50 клиентов вы можете не смотреть на реализацию веб-сервера/клиента...

Тем не менее, есть два способа обработки связи с клиентским сервером: 1. Клиент периодически проверяет сервер для получения обновлений 2. Клиент поддерживает соединение, открытое для сервера, и сервер отвечает хорошо известным (как в обоих сторонах пониманием) протоколом.