Как конвертировать сокет stdin в сокет запроса в Dart? - PullRequest
0 голосов
/ 01 февраля 2019

Я получаю сообщение об ошибке

Необработанное исключение: NoSuchMethodError: При записи строки в socket.write был вызван метод 'write'.

OnС другой стороны, если я подключить стандартный ввод к сокету, это прекрасно работает.В приведенном ниже коде, если вы комментируете socket.write ('$ _ request \ r \ n');и раскомментируйте stdin.listen ((data) =>, вы увидите, что все работает так, как должно быть.

String _request = "Hello World"; 

жестко запрограммировано, но может быть получено из-заИнтернет или другой клиент. Я пытаюсь следовать некоторому примеру и не могу понять, почему stdin.listen работает, а не стандартная строка.

Поэтому мой вопрос: Как преобразовать сокет stdin в сокет запроса в Dart?

Это справка по рабочему коду @Gazi:

ОБНОВЛЕНО:

Socket.connect("192.168.22.120", 3000)
          .then((Socket sock) {
    socket = sock;
    socket.listen(dataHandler,
            onError: errorHandler,
            onDone: doneHandler,
            cancelOnError: false);
  }).then((_) {
    print(_request); // so that your code runs AFTER the TCP/IP connection
    socket.write('$_request\r\n');
  })
  .catchError((AsyncError e) {
    print("Unable to connect: $e");
    exit(1);
  });

1 Ответ

0 голосов
/ 01 февраля 2019

Если это ваш код, вот что происходит:

Код внутри части .then() выполняется позже по сравнению с socket.write() ниже..then() назначает функцию обратного вызова и движется дальше.Сразу после этого socket.write() ниже вызывается.После этого, как только соединение TCP / IP установлено, выполняется socket = sock.Таким образом, ваша переменная socket не назначается при вызове socket.write().

Вот что происходит со строкой stdin: код (data) => socket.write выполняется после нажатия на клавиатуру.Это происходит после установления соединения TCP / IP.Поэтому ваш socket назначен.

Вот что вы должны сделать вместо этого:

  Socket.connect("192.168.22.120", 3000)
          .then((Socket sock) {
    socket = sock;
    socket.listen(dataHandler,
            onError: errorHandler,
            onDone: doneHandler,
            cancelOnError: false);
  }).then((_) {
    print(_request); // so that your code runs AFTER the TCP/IP connection
    socket.write('$_request\r\n');
  })
  .catchError((AsyncError e) {
    print("Unable to connect: $e");
    exit(1);
  });

, чтобы ваш код выполнялся ПОСЛЕ соединения TCP / IP.Если вы используете async / await, это будет еще проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...