socket_io_client 2.0.3+1 copy "socket_io_client: ^2.0.3+1" to clipboard
socket_io_client: ^2.0.3+1 copied to clipboard

Dartlang port of for web, flutter, dartvm to use

example/ #

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

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

Usage #

Dart Server

import 'package:socket_io/socket_io.dart';

main() {
  // Dart server
  var io = new 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(

Troubleshooting #

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() { = new MyHttpOverrides();

Memory leak issues in iOS when closing socket. #

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 #

Fork #

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.

Who Uses #

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

Contributors #

pub points


unverified uploader

Dartlang port of for web, flutter, dartvm to use

Repository (GitHub)
View/report issues


API reference


MIT (license)


js, logging, socket_io_common


Packages that depend on socket_io_client