패키지, 저장소 및 앱 카테고리 검색

패키지 상세v3.1.6

socket_io_client

웹, 플러터, dartvm용 socket.io-client의 다트랭 포트

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
30.1만
좋아요
1.6천
Pub 점수
150

패키지 설치

flutter pub add socket_io_client

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

Flutter 앱과 서버 간 실시간 양방향 통신을 가능하게 하는 Dart 기반의 Socket.IO 클라이언트 구현입니다. Android, iOS, Web, macOS, Windows, Linux 등 다양한 플랫폼에서 WebSocket 프로토콜을 지원합니다. 실시간 업데이트, 채팅 애플리케이션, 실시간 데이터 동기화와 같은 이벤트 기반 상호작용을 용이하게 합니다. 기존 Socket.IO 서버와의 원활한 통합을 위해 설계되었으며, 연결, 이벤트 발행, 서버 응답 수신을 위한 간단한 API를 제공합니다. 낮은 지연 시간 통신이 필요한 인터랙티브하고 반응성 있는 애플리케이션 개발에 이상적입니다.

사용 사례

  • 실시간 채팅 애플리케이션
  • 실시간 데이터 대시보드
  • 멀티플레이어 게임 동기화
  • 사물인터넷 장치 모니터링
  • 협업 편집 도구

주요 기능

  • 크로스 플랫폼 웹소켓 지원
  • 이벤트 기반 통신
  • 자동 재연결
  • 네임스페이스 및 방 관리
  • 발신 및 수신을 위한 간단한 API
  • Socket.IO 서버와의 호환성

적합한 대상

  • 실시간 앱 개발
  • 인터랙티브 웹 및 모바일 앱
  • 서버-클라이언트 이벤트 브로드캐스팅
  • 저지연 업데이트가 필요한 응용 프로그램
  • 백엔드에서 Socket.IO를 사용하는 개발자

고려 사항

  • 호환되는 Socket.IO 서버 필요
  • 네트워크 문제에 대한 추가 오류 처리가 필요할 수 있습니다
  • 성능은 서버 신뢰성에 따라 달라집니다
  • 최적화 없이 고처리량 시나리오에 적합하지 않습니다
  • 성숙한 라이브러리에 비해 문서가 제한적

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

socket.io-client-dart

Port of awesome JavaScript Node.js library - Socket.io-client v2._ ~ v4._ - in Dart

Version info

socket.io-client-dart Socket.io Server
v0.9.* ~ v1.* v2.*
v2.* v3.* ~ v4.6.*
v3.* v4.7.* ~ v4.*

Usage

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");
    });
  });
  io.listen(3000);
}
Dart Client

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

main() {
  // Dart client
  IO.Socket socket = IO.io('http://localhost:3000');
  socket.onConnect((_) {
    print('connect');
    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',
    OptionBuilder()
      .setTransports(['websocket']) // for Flutter or Dart VM
      .disableAutoConnect()  // disable auto-connection
      .setExtraHeaders({'foo': 'bar'}) // optional
      .build()
  );
socket.connect();

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.
socket.io.options['extraHeaders'] = {'foo': 'bar'}; // Update the extra headers.
socket.io..disconnect()..connect(); // Reconnect the socket manually.
Custom WebSocket connector

Use setWebSocketConnector to plug in a custom WebSocket implementation — for example CupertinoWebSocket/OkHttpWebSocket from package:cupertino_http / package:cronet_http, or a dart:io HttpClient with custom TLS/proxy settings. The connector receives the extraHeaders you set via setExtraHeaders (forwarded on native; browsers cannot send custom headers on the WebSocket handshake, so they are ignored there).

import 'package:cupertino_http/cupertino_http.dart';

Socket socket = io('http://localhost:3000',
    OptionBuilder()
      .setTransports(['websocket'])
      .setWebSocketConnector((uri, {protocols, headers}) {
        final config = URLSessionConfiguration.defaultSessionConfiguration();
        if (headers != null) config.httpAdditionalHeaders = headers;
        return CupertinoWebSocket.connect(uri, protocols: protocols, config: config);
      })
      .build());
Migrating from setHttpClientAdapter

HttpClientAdapter and OptionBuilder.setHttpClientAdapter() are deprecated since 3.1.6 and will be removed in 4.0.0. (They were unintentionally dropped in 3.1.5 — see #442 — and restored as deprecated shims to keep ^3.1.x builds compiling.) Replace them with setWebSocketConnector. To keep using a custom dart:io HttpClient on native (e.g. for self-signed certificates or a proxy), add web_socket to your dependencies and wrap the socket with IOWebSocket.fromWebSocket:

import 'dart:io';
import 'package:web_socket/io_web_socket.dart';

// Before (deprecated):
//   io('http://localhost:3000',
//     OptionBuilder().setHttpClientAdapter(myAdapter).build());

// After:
Socket socket = io('http://localhost:3000',
    OptionBuilder()
      .setTransports(['websocket'])
      .setWebSocketConnector((uri, {protocols, headers}) async {
        final raw = await WebSocket.connect(
          uri.toString(),
          protocols: protocols,
          headers: headers,
          customClient: myHttpClient, // your custom dart:io HttpClient
        );
        return IOWebSocket.fromWebSocket(raw);
      })
      .build());
Emit with acknowledgement
Socket socket = ... // Create socket.
socket.onConnect((_) {
    print('connect');
    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 = [
  'connect',
  'connect_error',
  'disconnect',
  'error',
  'reconnect',
  'reconnect_attempt',
  'reconnect_failed',
  'reconnect_error',
  'ping',
  'pong'
];

// Replace 'onConnect' with any of the above events.
socket.onConnect((_) {
    print('connect');
});
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;
    ack(null);
});

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 = IO.io('http://localhost:3000',
  OptionBuilder()
      .setTransports(['websocket']) // for Flutter or Dart VM
      .setExtraHeaders({'foo': 'bar'}) // optional
      .build());

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 => _socketResponse.stream;

  void dispose(){
    _socketResponse.close();
  }
}

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 = IO.io('http://localhost:3000',
      OptionBuilder()
       .setTransports(['websocket']).build());

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

    //When an event received 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);

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

Important Notice: Handling Socket Cache and subsequent lookups

There is a design decision in the baseline IO lookup command related to the caching of socket instances.

Lookup protocol

We reuse the existing instance based on same scheme/port/host.

It is important to make clear that both dispose() and destroy() do NOT remove a host from the cache of known connections. This can cause attempted subsequent connections to ignore certain parts of your configuration if not handled correctly. You must handle this by using the options available in the OptionBuilder during the first creation of the instance.

Examples

In the following example, there is a userId and username set as extra headers for this connection. If you were to try and create the same connection with updated values, if the host is the same, the extra headers will not be updated and the old connection would be returned.

_socket = io.io(
        host,
        io.OptionBuilder()
            .setTransports(['websocket'])
            .setExtraHeaders({'id': userId, 'name': username})
            .disableAutoConnect()
            .enableReconnection()
            .build());

In order to prevent this, depending on your application's needs, you can either use enableForceNew() or disableMultiplex() to the option builder. These options would modify all connections using the same host, so be aware and plan accordingly.

An additional option, if it fits your use case, would be to follow the usage mentioned above in Update the extra headers. By updating the extra headers outside of the building of the options, you can guarantee that your connections will have the values you are expecting.

Troubleshooting

Cannot connect "https" server or self-signed certificate server
class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}

void main() {
  HttpOverrides.global = MyHttpOverrides();
  runApp(MyApp());
}
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/

<key>com.apple.security.network.client</key>
<true/>

For more details, please take a look at https://flutter.dev/desktop#setting-up-entitlements

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 socket.io-client-dart

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 Contributing.md in this repository.

Who Uses

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

Socket.io Dart Server

Contributors

카테고리

의존성

의존성 목록 4 개

소스 저장소

이 패키지를 사용하는 프로젝트