如何将标准输入套接字转换为 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,就更简单了。
我收到一个错误
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,就更简单了。