Асинхронная разнонаправленная коммуникация клиента сервера по тому же открытому сокету?

Мне понравился метод Lost Koder. Я столкнулся с проблемами при попытке сериализации более сложных объектов, чьи члены / методы не сериализуемы. Вот моя реализация, которая работает с большим количеством объектов:

class Serializer(object):
    @staticmethod
    def serialize(obj):
        def check(o):
            for k, v in o.__dict__.items():
                try:
                    _ = json.dumps(v)
                    o.__dict__[k] = v
                except TypeError:
                    o.__dict__[k] = str(v)
            return o
        return json.dumps(check(obj).__dict__, indent=2)
23
задан Ijas Ameenudeen 20 January 2019 в 13:44
поделиться

4 ответа

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

в то время сервер мог передать сообщения обратно клиентской канавке то же открытое соединение.

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

8
ответ дан sven 29 November 2019 в 02:56
поделиться

Используя асинхронную передачу полностью возможно в единственном потоке!

существует шаблон общего умысла в разработке сетевого программного обеспечения, названной реакторным шаблоном ( взгляд на эту книгу ). Некоторая известная сетевая библиотека обеспечивает реализацию этого шаблона ( взгляд на ACE).

Кратко, реактор является объектом, Вы регистрируете все свои сокеты внутри, и Вы ожидаете чего-то. Если что-то произошло (новые данные прибыли, соединение близко...), реактор уведомит Вас. И конечно, можно использовать только один сокет для отправки и полученные данные асинхронно.

7
ответ дан Steve Gury 29 November 2019 в 02:56
поделиться

Я не ясен на том, желаете ли Вы добавить асинхронные биты к серверу в C# или клиенту в C++.

, Если Вы говорите о выполнении этого в C++, настольные платформы Windows могут сделать, ввод-вывод сокета асинхронно посредством того использования API перекрыл ввод-вывод. Для сокетов, WSASend, WSARecv оба позволяют асинхронный ввод-вывод (прочитайте документацию относительно их параметров LPOVERLAPPED, которые можно заполнить с событиями, которые установлены, когда ввод-вывод завершается).

я не знаю, поддерживают ли платформы Windows Mobile эти функции, таким образом, Вам, возможно, придется сделать некоторое дополнительное рытье.

3
ответ дан fastcall 29 November 2019 в 02:56
поделиться

Выезд asio. Это - перекрестная совместимая библиотека C++ для асинхронного IO. Я не уверен, было ли это полезно для сервера (я никогда не пытался связать стандартный DLL C++ с c# проектом), но для клиента это было бы полезно.

Мы используем его с нашим приложением, и это решило большинство наших проблем параллелизма IO.

3
ответ дан roo 29 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: