Sample code for 30+ languages & platforms
Dart Requires Chilkat v11.0.0+

Transfer a File using Sockets (TLS or non-TLS)

See more Socket/SSL/TLS Examples

Demonstrates how to two programs, one a socket writer and the other a socket reader, can transfer a file. The connection can be TLS or a regular non-encrypted TCP connection.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // This example requires the Chilkat API to have been previously unlocked.
  // See Global Unlock Sample for sample code.

  // On the sending side, we'll load the file into a BinData object and send.
  // On the receiving side, we'll read from the socket connection into a BinData, and save to a file.
  // This example assumes the file is not crazy-large, and that the entire contents
  // can fit into memory.  
  // (If the file is too large for memory, there are other ways to send. It just involves streaming or 
  // sending the file chunk-by-chunk..)

  // This section of code is for the sender.
  final bdToSend = CkBinData();
  bdToSend.loadFile('somePath/someFile.dat');
  // Assume success for the example...

  final sndSock = CkSocket();
  final bUseTls = true;
  final port = 5555;
  var maxWaitMs = 5000;
  sndSock.connect('some_domain_or_ip.com', port, bUseTls, maxWaitMs);
  // Assume success for the example...

  // Tell the receiver how many bytes are coming.
  final numBytes = bdToSend.numBytes;
  final bBigEndian = true;
  sndSock.sendInt32(numBytes, bBigEndian);

  // Send the file data (sends the entire contents of bdToSend).
  sndSock.sendBd(bdToSend, 0, 0);

  // Get an acknowledgement.
  try {
    sndSock.receiveInt32(bBigEndian);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Did the receiver get the correct number of bytes?
  if (sndSock.receivedInt != numBytes) {
    print('The receiver did not acknowledge with the correct number of bytes.');
    return;
  }

  print('File sent!');

  // ------------------------------------------------------------------------------------
  // The code below is for the receiving side (running on some other computer..)

  final listenSock = CkSocket();

  try {
    listenSock.bindAndListen(5555, 25);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Get the next incoming connection
  // Wait a maximum of 20 seconds (20000 millisec)
  final rcvSock = CkSocket();
  try {
    listenSock.acceptNext(20000, rcvSock);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // The sender will first send the big-endian integer for the number of bytes
  // that are forthcoming..
  try {
    rcvSock.receiveInt32(bBigEndian);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  final numBytesComing = rcvSock.receivedInt;

  // Receive that many bytes..
  final bdReceived = CkBinData();
  try {
    rcvSock.receiveBdN(numBytesComing, bdReceived);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Acknowledge the sender by sending back the number of bytes we received.
  rcvSock.sendInt32(bdReceived.numBytes, bBigEndian);

  // Close the connection.
  maxWaitMs = 20;
  rcvSock.close(maxWaitMs);

  // Save the received data to a file.
  bdReceived.writeFile('somePath/someFile.dat');
  // Assume success for the example...

  print('File received!');
}