我是Dart的新手,我不确定如何使用Sockets ...
我有以下问题:
algorithms
的列表,所有这些都扩展了AlgInterface,它只是一个简单的抽象类,只有一个称为handle的函数。algorithms
上进行for循环以调用该函数。由于我没有连接,或者从该连接中收到任何错误,当我尝试连接时,问题出现了:
我的代码:
@override
Future<bool> handle(Message msg) async {
if (msg.type == Message_Type.PL_SEND) {
var receiverPort = msg.plSend.destination.port;
print('PL_SEND');
var _socket;
await Socket.connect(ip, receiverPort).then((socket) {
print('CONNECTED');
_socket = socket;
}).then((_) {
print('SUCCESS');
var networkMsg = NetworkMessage();
networkMsg.senderHost = ip;
networkMsg.senderListeningPort = port;
networkMsg.message.mergeFromMessage(msg.plSend.message);
var toSend = Message();
toSend.type = Message_Type.NETWORK_MESSAGE;
toSend.abstractionId = msg.abstractionId;
toSend.systemId = msg.systemId;
toSend.networkMessage = networkMsg;
var message = Uint8List(4);
var byteData = ByteData.view(message.buffer);
var uint8 = toSend.writeToBuffer();
byteData.setUint32(0, 0);
byteData.setUint32(0, 0);
byteData.setUint32(0, 0);
byteData.setUint32(0, uint8.lengthInBytes);
_socket.add(message);
_socket.add(uint8);
_socket.close();
return true;
}).catchError((err) => print('ERR: ' + err));
_socket?.close();
return Future.value(true);
}
return Future.value(false);
}
ip
将始终为127.0.0.1,receiverport
将位于5005-5007之间的任何位置,是的,我确实提供了这些端口,它们是可用的。
我也尝试过在没有Future和标头为bool handle(Message msg)
的函数中使用它,但没有任何改变。
这是我调用handle函数的方式:
_algorithms.forEach((alg) async => await alg.handle(msg));
输出:
...
PL_SEND
PL_SEND
PL_SEND
PL_SEND
PL_SEND
PL_SEND
PL_SEND
PL_SEND
PL_SEND
...
任何想法我该如何解决?
我认为您对await
和then
的用法感到困惑。如果您使用的是await
,则无需使用then
,因为await
会自动将您的代码打包在then
中。
我不知道这是否是问题,但我会像这样编写代码。我应该注意,我很难在不了解上下文的情况下编写示例,因此如果您想要一个完整的示例,则需要将其余代码发布到例如gist.github.com:
@override
Future<bool> handle(Message msg) async {
if (msg.type == Message_Type.PL_SEND) {
var receiverPort = msg.plSend.destination.port;
print('PL_SEND');
final _socket = await Socket.connect(ip, receiverPort);
print('CONNECTED');
try {
print('SUCCESS');
var networkMsg = NetworkMessage();
networkMsg.senderHost = ip;
networkMsg.senderListeningPort = port;
networkMsg.message.mergeFromMessage(msg.plSend.message);
var toSend = Message();
toSend.type = Message_Type.NETWORK_MESSAGE;
toSend.abstractionId = msg.abstractionId;
toSend.systemId = msg.systemId;
toSend.networkMessage = networkMsg;
var message = Uint8List(4);
var byteData = ByteData.view(message.buffer);
var uint8 = toSend.writeToBuffer();
byteData.setUint32(0, 0);
byteData.setUint32(0, 0);
byteData.setUint32(0, 0);
byteData.setUint32(0, uint8.lengthInBytes);
_socket.add(message);
_socket.add(uint8);
await _socket.flush();
return true;
} catch (e) {
print('ERR: ' + e.toString());
return true;
} finally {
await _socket.close();
}
}
}
[另一个注意事项是,您在关闭插座之前忘记了flush
。 close
不保证文档中所述的冲洗:
注意:对IOSink的写入可能会被缓冲,并且可能不会通过调用close()来刷新。要刷新所有缓冲的写入,请在调用close()之前先调用flush()。