Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time
August 1, 2023 14:39
August 1, 2023 14:39
August 1, 2023 15:24
December 27, 2019 13:06
November 20, 2019 16:30
March 12, 2018 10:58
August 1, 2023 15:24

Port of awesome JavaScript Node.js library - v2.0.1~v3.0.3 - in Dart

Version info: Server
v0.9.* ~ v1.* v2.*
v2.* v3.* & v4.*


Dart Server

import 'package:socket_io/socket_io.dart';

main() {
  // Dart server
  var io = Server();
  var nsp = io.of('/some');
  nsp.on('connection', (client) {
    print('connection /some');
    client.on('msg', (data) {
      print('data from /some => $data');
      client.emit('fromServer', "ok 2");
  io.on('connection', (client) {
    print('connection default namespace');
    client.on('msg', (data) {
      print('data from default => $data');
      client.emit('fromServer', "ok");

Dart Client

import 'package:socket_io_client/socket_io_client.dart' as IO;

main() {
  // Dart client
  IO.Socket socket ='http://localhost:3000');
  socket.onConnect((_) {
    socket.emit('msg', 'test');
  socket.on('event', (data) => print(data));
  socket.onDisconnect((_) => print('disconnect'));
  socket.on('fromServer', (_) => print(_));

Connect manually

To connect the socket manually, set the option autoConnect: false and call .connect().

For example,

Socket socket = io('http://localhost:3000', 
      .setTransports(['websocket']) // for Flutter or Dart VM
      .disableAutoConnect()  // disable auto-connection
      .setExtraHeaders({'foo': 'bar'}) // optional

Note that .connect() should not be called if autoConnect: true (by default, it's enabled to true), as this will cause all event handlers to get registered/fired twice. See Issue #33.

Update the extra headers

Socket socket = ... // Create socket.['extraHeaders'] = {'foo': 'bar'}; // Update the extra headers.; // Reconnect the socket manually.

Emit with acknowledgement

Socket socket = ... // Create socket.
socket.onConnect((_) {
    socket.emitWithAck('msg', 'init', ack: (data) {
        print('ack $data') ;
        if (data != null) {
          print('from server $data');
        } else {
          print("Null") ;

Socket connection events

These events can be listened on.

const List EVENTS = [

// Replace 'onConnect' with any of the above events.
socket.onConnect((_) {

Acknowledge with the socket server that an event has been received.

socket.on('eventName', (data) {
    final dataList = data as List;
    final ack = dataList.last as Function;

Usage (Flutter)

In Flutter env. not (Flutter Web env.) it only works with dart:io websocket, not with dart:html websocket or Ajax (XHR), so in this case you have to add setTransports(['websocket']) when creates the socket instance.

For example,

IO.Socket socket ='http://localhost:3000',
      .setTransports(['websocket']) // for Flutter or Dart VM
      .setExtraHeaders({'foo': 'bar'}) // optional

Usage with stream and streambuilder in Flutter

import 'dart:async';

// STEP1:  Stream setup
class StreamSocket{
  final _socketResponse= StreamController<String>();

  void Function(String) get addResponse => _socketResponse.sink.add;

  Stream<String> get getResponse =>;

  void dispose(){

StreamSocket streamSocket =StreamSocket();

//STEP2: Add this function in main function in main.dart file and add incoming data to the stream
void connectAndListen(){
  IO.Socket socket ='http://localhost:3000',

    socket.onConnect((_) {
     socket.emit('msg', 'test');

    //When an event recieved from server, data is added to the stream
    socket.on('event', (data) => streamSocket.addResponse);
    socket.onDisconnect((_) => print('disconnect'));


//Step3: Build widgets with streambuilder

class BuildWithSocketStream extends StatelessWidget {
  const BuildWithSocketStream({Key key}) : super(key: key);

  Widget build(BuildContext context) {
    return Container(
      child: StreamBuilder(
        stream: streamSocket.getResponse ,
        builder: (BuildContext context, AsyncSnapshot<String> snapshot){
          return Container(


Cannot connect "https" server or self-signed certificate server

class MyHttpOverrides extends HttpOverrides {
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;

void main() { = MyHttpOverrides();

Memory leak issues in iOS when closing socket.

  • Refer to #108 issue. Please use socket.dispose() instead of socket.close() or socket.disconnect() to solve the memory leak issue on iOS.

Connect_error on MacOS with SocketException: Connection failed

By adding the following key into the to file *.entitlements under directory macos/Runner/


For more details, please take a look at

Can't connect socket server on Flutter with Insecure HTTP connection

The HTTP connections are disabled by default on iOS and Android, so here is a workaround to this issue, which mentioned on stack overflow

Notes to Contributors


If you'd like to contribute back to the core, you can fork this repository and send us a pull request, when it is ready.

If you are new to Git or GitHub, please read this guide first.

Contribution of all kinds is welcome. Please read in this repository.

Who Uses

  • Quire - a simple, collaborative, multi-level task management tool.
  • KEIKAI - a web spreadsheet for Big Data. Dart Server