如何将标准输入套接字转换为 Dart 中的请求套接字?

How to convert stdin socket to request socket in Dart?

我收到一个错误

Unhandled exception: NoSuchMethodError: The method 'write' was called on null while sending the string to socket.write.

另一方面,如果我将 stdin 连接到套接字,则工作正常。在下面的代码中,如果您评论 socket.write('$_request\r\n');并取消注释 stdin.listen((data) => 你会看到一切正常。

String _request = "Hello World"; 

是硬编码的,但它可能来自互联网或其他客户端。我尝试遵循一些示例,但无法理解为什么 stdin.listen 有效而不是标准字符串。

所以我的问题是如何在 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);
  });

如果这是您的代码,则情况如下:

.then() 部分中的代码比下面的 socket.write() 部分晚了 运行。 .then() 正在分配回调函数并继续。紧接着下面的 socket.write() 被调用。之后,一旦建立了 TCP/IP 连接,就会执行 socket = sock。因此,调用 socket.write() 时未分配 socket 变量。

以下是 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,就更简单了。