Dart Socket
last modified April 4, 2025
The Socket class in Dart provides TCP network communication
functionality. It's part of the dart:io library and enables
both client and server network operations.
Sockets support bidirectional communication between endpoints. They can transfer raw bytes or text data over TCP/IP networks with various events.
Basic Definition
A Socket represents a TCP network connection between two
endpoints. It provides streams for reading and writing data asynchronously.
Key features include event-based data handling, connection management, and support for both IPv4 and IPv6 addresses. Sockets work with Streams.
Basic Socket Client
This example shows a simple TCP client that connects to a server.
import 'dart:io';
void main() async {
try {
var socket = await Socket.connect('localhost', 8080);
print('Connected to server');
socket.write('Hello from Dart client');
socket.destroy();
} catch (e) {
print('Error: $e');
}
}
We create a socket connection to localhost on port 8080. After sending a message, we close the connection. Error handling catches connection issues.
$ dart main.dart Connected to server
Socket with Data Listening
This example demonstrates reading data from a socket connection.
import 'dart:io';
import 'dart:convert';
void main() async {
var socket = await Socket.connect('example.com', 80);
socket.write('GET / HTTP/1.1\r\nHost: example.com\r\n\r\n');
socket.listen(
(List<int> data) {
print(utf8.decode(data));
},
onDone: () {
print('Connection closed');
socket.destroy();
}
);
}
We connect to a web server and send an HTTP request. The listen callback handles incoming data. The connection closes automatically when complete.
$ dart main.dart HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 ... Connection closed
Socket Server
This example creates a simple TCP server that accepts client connections.
import 'dart:io';
void main() async {
var server = await ServerSocket.bind('127.0.0.1', 8080);
print('Server listening on ${server.address}:${server.port}');
server.listen((Socket socket) {
socket.write('Hello from server!\n');
socket.close();
});
}
The server binds to localhost port 8080. For each client connection, it sends a greeting and closes. ServerSocket manages multiple clients.
$ dart main.dart Server listening on 127.0.0.1:8080
Bidirectional Communication
This example shows a chat-like bidirectional socket communication.
import 'dart:io';
import 'dart:async';
void main() async {
var socket = await Socket.connect('localhost', 8080);
socket.listen(
(data) => print('Server: ${String.fromCharCodes(data)}'),
onDone: () => socket.destroy()
);
var input = stdin.transform(utf8.decoder);
await for (var message in input) {
socket.write(message);
}
}
The client connects to a server and listens for messages. It also reads user input from console and sends it to the server. UTF-8 handles text.
$ dart main.dart Hello Server: Hi there! How are you? Server: I'm fine, thanks!
Socket with Timeout
This example demonstrates socket connection with timeout handling.
import 'dart:io';
void main() async {
try {
var socket = await Socket.connect('localhost', 8080)
.timeout(Duration(seconds: 5));
socket.write('Quick message');
await socket.flush();
socket.destroy();
print('Message sent successfully');
} on SocketException catch (e) {
print('Socket error: $e');
} on TimeoutException {
print('Connection timed out');
}
}
The connection attempt will timeout after 5 seconds if unsuccessful. We handle both socket errors and timeout exceptions separately.
$ dart main.dart Connection timed out
Best Practices
- Error handling: Always handle SocketException and other errors
- Resource cleanup: Call destroy() or close() when done
- Buffering: Use flush() for important writes
- Encoding: Specify text encoding when needed
- Timeouts: Set reasonable timeouts for operations
Source
This tutorial covered Dart's Socket class with practical examples showing client/server communication, data handling, and error management.
Author
List all Dart tutorials.