【问题标题】:How to convert stdin socket to request socket in Dart?如何将标准输入套接字转换为 Dart 中的请求套接字?
【发布时间】:2019-02-01 09:13:02
【问题描述】:

我遇到了一个错误

未处理的异常:NoSuchMethodError:在将字符串发送到 socket.write 时,方法 'write' 在 null 上被调用。

另一方面,如果我将标准输入连接到套接字,则可以正常工作。在下面的代码中,如果您评论 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);
  });

【问题讨论】:

    标签: sockets dart request stdin


    【解决方案1】:

    如果这是您的代码,这就是正在发生的事情:

    与下面的socket.write() 相比,.then() 部分中的代码运行时间较晚。 .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,它会更简单。

    【讨论】:

    • 我得到这个错误:参数类型'() → dart.core::Null' 不能分配给参数类型'(dynamic) → dart.async::FutureOr '。尝试更改参数的类型,或将参数转换为 '(dynamic) → dart.async::FutureOr'。 }).then(() {
    • 谢谢,我加下划线。 }).then((_) { 及其工作
    • 好的,让我修复代码,抱歉我没有测试它:)
    • 没关系。这在 main 中有效,但在 Future 中无效。我对新问题持开放态度,如果您可以在那里做出贡献,我将不胜感激。 stackoverflow.com/questions/54479462/…
    猜你喜欢
    • 2012-08-27
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多