Dart-套接字-无法连接

问题描述 投票:0回答:1

我是Dart的新手,我不确定如何使用Sockets ...

我有以下问题:

  1. 我有一个带有algorithms的列表,所有这些都扩展了AlgInterface,它只是一个简单的抽象类,只有一个称为handle的函数。
  2. 我正在algorithms上进行for循环以调用该函数。
  3. 只有一个,只有一个算法,需要将一些数据发送到服务器。

由于我没有连接,或者从该连接中收到任何错误,当我尝试连接时,问题出现了:

我的代码:

@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.1receiverport将位于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
...

任何想法我该如何解决?

sockets dart serversocket dart-pub dart-html
1个回答
0
投票

我认为您对awaitthen的用法感到困惑。如果您使用的是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();
    }
  }
}

[另一个注意事项是,您在关闭插座之前忘记了flushclose不保证文档中所述的冲洗:

注意:对IOSink的写入可能会被缓冲,并且可能不会通过调用close()来刷新。要刷新所有缓冲的写入,请在调用close()之前先调用flush()。

https://api.dart.dev/stable/2.8.2/dart-io/Socket/close.html

© www.soinside.com 2019 - 2024. All rights reserved.