Как вызывается didAcceptConnectionWithInputStream: outputStream:?

Мой первый вопрос: как мне получить вызов didAcceptConnectionWithInputStream:outputStream: в NSNetServiceDelegate?

Последующий вопрос: могу ли я установить соединение между клиентом и сервером, хотя я никогда не получаю обратного вызова о том, что соединение было принято (через didAcceptConnectionWithInputStream:outputStream:)?

Я понимаю, что вызов publishWithOptions при передаче параметра NSNetServiceListenForConnections должен привести к вызову обратного вызова NetServiceDelegate (didAcceptConnectionWithInputStream:outputStream:). Однако этот обратный вызов не вызывается.

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

  1. Создать NSNetService с

    self.netService = [[NSNetService alloc] initWithDomain: @ "" тип: _serviceType name: (_ name == nil)? @ "": _name порт: 0];

  2. Запланировать сервис в текущем цикле выполнения в режиме по умолчанию

  3. Установите делегата на объект-оболочку моего сервера
  4. позвонить publishWithOptions:NSNetServiceListenForConnections

Вот шаги, которые я предпринимаю для просмотра сервисов:

  1. Создайте NSNetServiceBrowser и установите его делегата в мой объект-оболочку клиента
  2. Позвоните searchForServicesOfType, чтобы получить тот же тип услуги и домен, что и NSNetService
  3. Перечислить службы в UITableView для пользовательского интерфейса, чтобы пользователь мог выбрать службу.
  4. Когда пользователь выбирает службу, установите делегата службы для моего клиентского объекта и вызовите getInputStream:outputSteam: в службе.
  5. После того, как getInputStream: outputSteam: вернет успех, я ожидаю, что будет вызван didAcceptConnectionWithInputStream:outputStream:. Однако этого не происходит.

Спасибо за вашу помощь!


person Sheamus    schedule 08.05.2014    source источник
comment
ты понял это?   -  person Legolas    schedule 15.07.2014


Ответы (3)


Проблема в том, что didAcceptConnectionWithInputStream:outputStream: должен вызываться со стороны, принимающей соединение.

Как только услуга станет доступной, вы звоните, чтобы получить потоки

[service getInputStream:&istream outputStream:&ostream]

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

- (void)netService:(NSNetService *)sender didAcceptConnectionWithInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream 

будет называться

person Boris    schedule 25.02.2015
comment
Да, я понимаю, что didAcceptConnectionWithInputStream:outputStream: должен быть вызван со стороны, принимающей соединение. В моем случае сервер также действует как клиент, и тем не менее этот метод обратного вызова didAcceptConnectionWithInputStream:outputStream: никогда не вызывался. - person Sheamus; 26.02.2015

По моему опыту, вызов getInputStream:outputStream: на клиенте не вызывает вызов didAcceptConnectionWithInputStream:outputStream: на сервере.

На клиенте после вызова getInputStream:outputStream: ваш клиент должен вызвать [inputStream open] и [outputStream open] перед вызовом didAcceptConnectionWithInputStream:outputStream:.

person PKCLsoft    schedule 14.10.2015

Все это часть ленивой инициализации.

Вызов getInputStream:outputStream: вернет вам два совершенно хороших потока NSStream, готовых к использованию. Итак, скажем, вы хотите записать какие-то данные? Сначала откройте поток записи ...

БАМ! netService:didAcceptConnectionWithInputStream:outputStream: называется.

person Peter    schedule 04.09.2015