Flutter实时通信插件socket_io的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter实时通信插件socket_io的使用

简介

socket.io-dart 是一个在Dart中实现的Socket.IO库,它移植了JavaScript Node.js库 Socket.io v2.0.1。这个库允许你在Dart应用中实现实时双向通信。

使用方法

服务器端

首先,你需要在服务器端设置一个Socket.IO服务器。以下是一个简单的示例:

import 'package:socket_io/socket_io.dart';

void main() {
  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);
}

客户端

JavaScript客户端

如果你有一个JavaScript客户端,可以使用以下代码连接到服务器:

// JS client
var socket = io('http://localhost:3000');
socket.on('connect', function() {
  console.log('connect');
});
socket.on('event', function(data) {
  console.log(data);
});
socket.on('disconnect', function() {
  console.log('disconnect');
});
socket.on('fromServer', function(e) {
  console.log(e);
});

Dart客户端

在Flutter应用中,你可以使用 socket_io_client 包来连接到服务器:

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

void main() {
  IO.Socket socket = IO.io('http://localhost:3000');

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

  socket.on('event', (data) {
    print(data);
  });

  socket.on('disconnect', (_) {
    print('disconnect');
  });

  socket.on('fromServer', (_) {
    print(_);
  });
}

多路复用支持

与Socket.IO一样,这个项目允许你创建多个命名空间(Namespaces),这些命名空间将作为独立的通信通道,但共享同一个底层连接。

房间支持

在每个命名空间内,你可以定义任意的频道(Rooms),客户端可以加入和离开这些频道。你可以向任何给定的房间广播消息,达到所有已加入该房间的客户端。

传输支持

socket.io-dart 支持以下传输方式:

  • polling: XHR / JSONP 轮询传输。
  • websocket: WebSocket 传输。

适配器支持

默认情况下,socket.io-dart 使用内存中的适配器类。更多详情请参阅 socket.io-adapter

示例项目

以下是一个完整的示例项目,展示了如何在Flutter应用中使用 socket_io_client 进行实时通信。

服务器端代码

import 'package:socket_io/socket_io.dart';

void main() {
  var io = Server();

  io.on('connection', (client) {
    print('New client connected: ${client.id}');
    
    client.on('msg', (data) {
      print('Received message: $data');
      client.emit('fromServer', 'Message received: $data');
    });

    client.on('disconnect', (_) {
      print('Client disconnected: ${client.id}');
    });
  });

  io.listen(3000);
  print('Server running on port 3000');
}

客户端代码(Flutter应用)

  1. pubspec.yaml 文件中添加依赖:
dependencies:
  flutter:
    sdk: flutter
  socket_io_client: ^2.0.0
  1. 创建一个简单的Flutter应用:
import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Socket.IO Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Socket.IO Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late IO.Socket socket;
  List<String> messages = [];

  @override
  void initState() {
    super.initState();
    socket = IO.io('http://localhost:3000', <String, dynamic>{
      'transports': ['websocket'],
    });

    socket.on('connect', (_) {
      print('Connected to server');
    });

    socket.on('fromServer', (data) {
      setState(() {
        messages.add(data);
      });
    });

    socket.on('disconnect', (_) {
      print('Disconnected from server');
    });
  }

  @override
  void dispose() {
    socket.disconnect();
    super.dispose();
  }

  void sendMessage(String message) {
    socket.emit('msg', message);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: messages.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(messages[index]),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    onSubmitted: (value) {
                      sendMessage(value);
                    },
                    decoration: InputDecoration(hintText: 'Enter a message'),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: () {
                    sendMessage('Hello from Flutter');
                  },
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

运行项目

  1. 启动服务器端代码。
  2. 在Flutter项目中运行客户端代码。

通过以上步骤,你可以在Flutter应用中实现与服务器的实时通信。希望这个示例对你有所帮助!


更多关于Flutter实时通信插件socket_io的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时通信插件socket_io的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用socket_io插件实现实时通信的代码示例。这个示例将展示如何连接到Socket.IO服务器,发送和接收消息。

首先,确保你已经在pubspec.yaml文件中添加了socket_io_client依赖:

dependencies:
  flutter:
    sdk: flutter
  socket_io_client: ^2.0.0-beta.4-nullsafety.0  # 请根据需要选择最新版本

然后,运行flutter pub get来安装依赖。

接下来,创建一个简单的Flutter应用,展示如何使用socket_io_client

主文件 main.dart

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Socket.IO Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SocketIODemo(),
    );
  }
}

class SocketIODemo extends StatefulWidget {
  @override
  _SocketIODemoState createState() => _SocketIODemoState();
}

class _SocketIODemoState extends State<SocketIODemo> {
  late IO.Socket socket;
  final TextEditingController _controller = TextEditingController();
  final List<String> _messages = [];

  @override
  void initState() {
    super.initState();
    // 连接到Socket.IO服务器
    socket = IO.io('http://your-socket-io-server-url', <String, dynamic>{
      'transports': ['websocket'],
    });

    // 监听连接事件
    socket.onConnect((_) {
      print('Socket connected');
      socket.emit('message', 'Hello from Flutter!');
    });

    // 监听消息事件
    socket.on('message', (data) {
      print('Received message: $data');
      setState(() {
        _messages.add('Server: $data');
      });
    });

    // 监听断开连接事件
    socket.onDisconnect((_) {
      print('Socket disconnected');
    });

    // 监听错误事件
    socket.onError((error) {
      print('Socket error: $error');
    });
  }

  @override
  void dispose() {
    socket.disconnect();
    _controller.dispose();
    super.dispose();
  }

  void _sendMessage() {
    String message = _controller.text;
    if (message.isNotEmpty) {
      socket.emit('message', message);
      setState(() {
        _messages.add('You: $message');
        _controller.clear();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Socket.IO Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Text(_messages[index]);
                },
              ),
            ),
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Send a message',
              ),
              onSubmitted: _sendMessage,
            ),
            SizedBox(height: 8.0),
            ElevatedButton(
              onPressed: _sendMessage,
              child: Text('Send'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 连接到Socket.IO服务器:使用IO.io方法连接到指定的Socket.IO服务器URL。这里你需要替换'http://your-socket-io-server-url'为你的Socket.IO服务器地址。

  2. 事件监听

    • socket.onConnect:当客户端成功连接到服务器时触发。
    • socket.on('message'):当服务器发送message事件时触发。
    • socket.onDisconnect:当客户端与服务器断开连接时触发。
    • socket.onError:当发生错误时触发。
  3. 发送消息:使用socket.emit方法发送消息到服务器。这里我们监听文本字段的提交事件和按钮点击事件来发送消息。

  4. UI展示:使用ListView.builder来动态展示消息列表,并使用TextFieldElevatedButton来输入和发送消息。

这个示例展示了如何在Flutter中使用socket_io_client插件实现基本的实时通信功能。根据你的具体需求,你可以进一步扩展这个示例,比如处理更多的事件类型、添加认证逻辑等。

回到顶部