Flutter网络通信插件socket_com的使用

Flutter网络通信插件socket_com的使用

在本教程中,我们将介绍如何使用 socket_com 插件来实现 Flutter 应用中的网络通信。我们将分别从服务器端和客户端的角度进行讲解,并提供完整的示例代码。


服务器端

启动服务器监听端口 3000

首先,我们需要启动一个服务器并监听指定的端口(例如 3000)。以下代码展示了如何创建一个服务器并处理客户端连接。

import 'dart:io';
import 'package:socket_com/socket_com.dart';

void main() async {
  // 创建一个服务器并绑定到 IP 和端口 3000
  final server = await ServerSocket.connect(ip: InternetAddress.anyIPv4, port: 3000);

  // 当有客户端连接时,调用 handleClient 方法
  server.onConnection((Socket client) {
    handleClient(client);
    /// 您可以使用 Socket 的方法(如 on)监听特定客户端的事件
  });

  print("服务器已启动,正在监听端口 3000...");
}

// 处理客户端连接逻辑
void handleClient(Socket client) {
  client.listen((data) {
    // 接收数据并打印
    print("来自客户端的数据: ${String.fromCharCodes(data)}");

    // 向客户端发送响应
    client.write("服务器已收到您的消息!");
  }, onError: (error) {
    print("发生错误: $error");
  }, onDone: () {
    print("客户端断开连接");
  });
}

客户端

接下来,我们将在客户端连接到上述服务器,并发送和接收数据。

连接到服务器(本地主机,端口 3000)

客户端需要连接到运行在本地主机上的服务器(端口 3000)。以下是连接代码:

import 'dart:io';
import 'package:socket_com/socket_com.dart';

void main() async {
  // 连接到服务器
  final Socket client = await ClientSocket.connect(host: "0.0.0.0", port: 3000);
  handleServerConnection(client);
}

// 处理与服务器的连接逻辑
void handleServerConnection(Socket client) {
  // 添加事件监听器,当接收到消息时触发回调
  final registered = client.on('message', (data) {
    print("从服务器接收到的消息: $data");
  });

  // 监听服务器发送的任何数据
  client.listen((data) {
    print("从服务器接收到的其他数据: ${String.fromCharCodes(data)}");
  });

  // 发送数据给服务器
  client.send('message', {"username": "Client", "message": "Hello Server!"});
}

示例代码说明

1. 数据传输类 (DTO)

为了方便数据传输,我们可以定义一个类并扩展自 DTO。以下是一个示例:

import 'dart:convert';

class Message extends DTO {
  String username;
  String message;

  Message({required this.username, required this.message});

  factory Message.fromJson(Map<String, dynamic> json) {
    return Message(username: json['username'], message: json['message']);
  }

  @override
  Map<String, dynamic> toJson() {
    return {"username": username, "message": message};
  }

  // 自定义编码方式
  @override
  String encode() {
    return json.encode(toJson());
  }
}

2. 使用 Message 类发送数据

我们可以通过 send 方法将 Message 对象发送给服务器:

client.send(
  'message',
  Message(
    username: "Client",
    message: "Hi, I am the client!",
  ),
);

完整示例代码

您可以参考以下完整示例代码,它结合了服务器端和客户端的功能:

服务器端代码 (server.dart)

import 'dart:io';
import 'package:socket_com/socket_com.dart';

void main() async {
  final server = await ServerSocket.connect(ip: InternetAddress.anyIPv4, port: 3000);
  server.onConnection((Socket client) {
    handleClient(client);
  });
  print("服务器已启动,正在监听端口 3000...");
}

void handleClient(Socket client) {
  client.listen((data) {
    print("来自客户端的数据: ${String.fromCharCodes(data)}");
    client.write("服务器已收到您的消息!");
  }, onError: (error) {
    print("发生错误: $error");
  }, onDone: () {
    print("客户端断开连接");
  });
}

客户端代码 (client.dart)

import 'dart:io';
import 'package:socket_com/socket_com.dart';

void main() async {
  final Socket client = await ClientSocket.connect(host: "0.0.0.0", port: 3000);
  handleServerConnection(client);
}

void handleServerConnection(Socket client) {
  final registered = client.on('message', (data) {
    print("从服务器接收到的消息: $data");
  });
  client.listen((data) {
    print("从服务器接收到的其他数据: ${String.fromCharCodes(data)}");
  });
  client.send('message', {"username": "Client", "message": "Hello Server!"});
}

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

1 回复

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


socket_com 是一个用于 Flutter 的插件,它提供了基于 WebSocket 的通信功能。使用 socket_com 插件,你可以轻松地在 Flutter 应用中实现 WebSocket 通信。以下是如何使用 socket_com 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 socket_com 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  socket_com: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 socket_com 插件:

import 'package:socket_com/socket_com.dart';

3. 创建 WebSocket 连接

使用 SocketCom 类来创建和管理 WebSocket 连接。以下是一个简单的示例:

class WebSocketExample extends StatefulWidget {
  [@override](/user/override)
  _WebSocketExampleState createState() => _WebSocketExampleState();
}

class _WebSocketExampleState extends State<WebSocketExample> {
  SocketCom? _socket;

  [@override](/user/override)
  void initState() {
    super.initState();
    _connectToWebSocket();
  }

  void _connectToWebSocket() {
    _socket = SocketCom('ws://your.websocket.url');

    _socket!.onConnect(() {
      print('WebSocket connected');
    });

    _socket!.onDisconnect(() {
      print('WebSocket disconnected');
    });

    _socket!.onError((error) {
      print('WebSocket error: $error');
    });

    _socket!.onMessage((message) {
      print('Received message: $message');
    });

    _socket!.connect();
  }

  void _sendMessage(String message) {
    _socket!.send(message);
  }

  [@override](/user/override)
  void dispose() {
    _socket!.disconnect();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebSocket Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => _sendMessage('Hello, WebSocket!'),
              child: Text('Send Message'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 处理 WebSocket 事件

在上面的示例中,我们使用了 onConnect, onDisconnect, onError, 和 onMessage 方法来处理 WebSocket 的不同事件。

  • onConnect: 当 WebSocket 连接成功时触发。
  • onDisconnect: 当 WebSocket 断开连接时触发。
  • onError: 当 WebSocket 发生错误时触发。
  • onMessage: 当接收到 WebSocket 消息时触发。

5. 发送消息

你可以使用 send 方法向 WebSocket 服务器发送消息:

_socket!.send('Hello, WebSocket!');

6. 断开连接

在不需要 WebSocket 连接时,记得调用 disconnect 方法来断开连接:

_socket!.disconnect();

7. 处理生命周期

dispose 方法中,确保断开 WebSocket 连接,以避免内存泄漏:

[@override](/user/override)
void dispose() {
  _socket!.disconnect();
  super.dispose();
}
回到顶部