简体   繁体   English

Dart Flutter 套接字是否可以通过套接字接收文件?

[英]Dart Flutter Socket is it possible to receive a file over a socket?

Dart Flutter Socket is it possible to receive a file over a socket? Dart Flutter 套接字是否可以通过套接字接收文件? for example a picture jpeg例如图片 jpeg

code that accepts text接受文本的代码

Future<String> getListUsers(String request) async {
  if (request != null) {
    Socket socket;
    await Socket.connect(ip, port).then((Socket sock) {
      socket = sock;
    }).then((_) {
      socket.write('$request\r\n');
      return socket.first;
    }).then((data) {
      response = utf8.decode(data);
      socket.close();
    }).catchError((Object e) {
      response = 'error';
    });
  } else {
    response = 'error';
  }
  return response;
}
bad, but it works, maybe someone needs to receive a file via a TCP socket, the only thing you need to know is the file size

Future<String> getImageFile(String request) async {
  Socket socket;
  final path = await _localPath;
  BytesBuilder builder = new BytesBuilder(copy: false);

  void doneHandlerDone(){
    socket.close();
  }

  void dataHandler(data){
    builder.add(data);

    if (builder.length >= 1716980) { // file size
      Uint8List dt = builder.takeBytes();
      final filename = 'test1.jpg';

      writeToFile(dt.buffer.asByteData(0, dt.buffer.lengthInBytes), '$path/$filename');
      doneHandlerDone();
    }
  }

  void errorHandler(error, StackTrace trace){
    print(error);
  }

  Socket.connect(ip, port).then((Socket sock) {
    socket = sock;
    socket.listen(dataHandler, onError: errorHandler, onDone: doneHandlerDone, cancelOnError: false);
  }).then((_) {
    socket.write('$request\r\n');
  }).catchError((Object e) {
    print("Unable to connect: $e");
  });
  return null;
}

Future<void> writeToFile(ByteData data, String path) {
  final buffer = data.buffer;
  return new File(path).writeAsBytes(buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM