Flutter网络通信插件socket_connector的使用

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

Flutter网络通信插件socket_connector的使用

简介

socket_connector 是一个用于连接两个 TCP 套接字并可选地显示流量的 Dart 包。TCP 套接字有两种类型:服务器和客户端。通常情况下,你需要选择一种类型。但有时候你可能需要将两个客户端或两个服务器连接起来,这时 socket_connector 就派上用场了。它提供了多种方法来实现这种连接,并且可以设置 verboselogTraffic 标志来查看更多的调试信息。

特性

  • 连接两个服务器套接字。
  • 连接两个客户端套接字。
  • 连接一个客户端套接字到一个服务器套接字。
  • 可选地设置 verbose 标志以查看更多调试信息。
  • 可选地设置 logTraffic 标志以查看传输和接收的可读(ASCII)字符。

入门

首先,你需要在你的项目中添加 socket_connector 依赖。打开 pubspec.yaml 文件,添加以下内容:

dependencies:
  socket_connector: ^1.0.0

然后运行以下命令来安装依赖:

dart pub get

使用示例

服务器到服务器连接

以下代码将打开两个服务器套接字并连接它们,同时显示任何在这两个套接字之间传输的数据。你可以使用 ncat 来测试这两个监听端口。你会看到在一个窗口中输入的内容会出现在另一个窗口中,同时也会在 Dart 程序中看到数据。

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

void main() async {
  // 一旦运行,使用 ncat 来检查套接字
  SocketConnector socketConnector = await SocketConnector.serverToServer(
    addressA: InternetAddress.anyIPv4,
    addressB: InternetAddress.anyIPv4,
    portA: 9000,
    portB: 8000,
    verbose: true,
    logTraffic: true,
  );
  print('Sender Port: ${socketConnector.sideAPort}'
      ' Receiver Port: ${socketConnector.sideBPort}');
}

运行上述代码后,你可以使用以下命令来测试:

ncat localhost 8000
ncat localhost 9000

客户端到服务器连接

以下代码将连接到 IP 地址为 192.168.1.149 的 SSH 服务器(端口 22),并通过本地端口 2000 转发。你可以使用 ssh -p 2000 localhost 来连接到远程服务器的 SSH 服务。

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

void main() async {
  // 一旦运行,使用 ncat 来检查套接字
  SocketConnector socketConnector = await SocketConnector.serverToServer(
    addressA: InternetAddress.anyIPv4,
    addressB: InternetAddress.anyIPv4,
    portA: 9000,
    portB: 8000,
    verbose: true,
    logTraffic: true,
  );
  print('Sender Port: ${socketConnector.sideAPort}'
      ' Receiver Port: ${socketConnector.sideBPort}');

  // 连接到 IP 地址为 192.168.1.149 的 SSH 服务器(端口 22),并通过本地端口 2000 转发
  InternetAddress? server = InternetAddress.tryParse('192.168.1.149');
  SocketConnector connector1 = await SocketConnector.socketToServer(
    addressA: server!,
    portA: 22,
    addressB: InternetAddress.anyIPv4,
    portB: 2000,
    verbose: true,
  );
  print('Sender Port: ${connector1.sideAPort}'
      ' Receiver Port: ${connector1.sideBPort}');
}

额外信息

以下是 SocketConnector 类文档中的摘录:

/// 典型用法是通过 [serverToServer], [serverToSocket], [socketToSocket] 和 [socketToServer] 方法,
/// 这些方法都是相同功能的不同变体 - 将信息从一个套接字传递到另一个套接字。
///
/// - 创建时,将创建一个持续时间为 [timeout] 的 [Timer]。当定时器回调执行时,如果 [connections] 为空,则调用 [close]。
/// - 当已建立的连接关闭时,如果 [connections] 为空,则调用 [close]。
/// - 当 [pendingA] 和 [pendingB] 都至少有一个条目时,新的 [Connection] 将被添加到 [connections] 中。
/// - 当 [verbose] 为 true 时,日志消息将记录到 [logger]。
/// - 当 [logTraffic] 为 true 时,套接字流量将记录到 [logger]。

TODO

目前只有 SocketConnector.serverToServer 处理单个会话中的多个套接字对;需要在 serverToSocketsocketToServer 中添加代码,以便当服务器套接字收到新连接时,打开到另一侧地址和端口的新连接。

希望这些信息对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter项目中使用socket_connector插件进行网络通信的示例代码。这个插件允许你通过Socket进行TCP/IP通信。首先,确保你已经在pubspec.yaml文件中添加了socket_connector依赖:

dependencies:
  flutter:
    sdk: flutter
  socket_connector: ^x.y.z  # 请替换为最新版本号

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

接下来,这里是一个简单的示例,展示如何使用socket_connector进行Socket通信:

import 'package:flutter/material.dart';
import 'package:socket_connector/socket_connector.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Socket Connector Example'),
        ),
        body: SocketCommunicationPage(),
      ),
    );
  }
}

class SocketCommunicationPage extends StatefulWidget {
  @override
  _SocketCommunicationPageState createState() => _SocketCommunicationPageState();
}

class _SocketCommunicationPageState extends State<SocketCommunicationPage> {
  SocketConnector? _socketConnector;
  TextEditingController _messageController = TextEditingController();
  TextEditingController _responseController = TextEditingController();

  @override
  void initState() {
    super.initState();
    initSocket();
  }

  void initSocket() {
    _socketConnector = SocketConnector(
      host: 'your_server_ip',  // 替换为你的服务器IP地址
      port: 12345,             // 替换为你的服务器端口号
    );

    _socketConnector!.onOpen = () {
      print("Socket connected");
      // 连接成功后可以发送消息
      _socketConnector!.send("Hello Server");
    };

    _socketConnector!.onMessage = (String message) {
      setState(() {
        _responseController.text += message + '\n';
      });
    };

    _socketConnector!.onError = (error) {
      print("Socket error: $error");
    };

    _socketConnector!.onClose = () {
      print("Socket closed");
    };

    // 尝试连接服务器
    _socketConnector!.connect();
  }

  void _sendMessage() {
    if (_socketConnector!.isOpen) {
      _socketConnector!.send(_messageController.text);
      _messageController.clear();
    } else {
      print("Socket is not open");
    }
  }

  @override
  void dispose() {
    _socketConnector?.close();
    _messageController.dispose();
    _responseController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextField(
            controller: _messageController,
            decoration: InputDecoration(labelText: 'Send Message'),
            maxLines: 4,
            keyboardType: TextInputType.multiline,
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: _sendMessage,
            child: Text('Send'),
          ),
          SizedBox(height: 32),
          Text('Server Response:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
          SizedBox(height: 8),
          Expanded(
            child: TextField(
              controller: _responseController,
              decoration: InputDecoration(border: InputBorder.none),
              maxLines: null,
              keyboardType: TextInputType.multiline,
              readOnly: true,
            ),
          ),
        ],
      ),
    );
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml中添加socket_connector依赖。
  2. Socket初始化:在initSocket方法中初始化SocketConnector,并设置连接、消息接收、错误和关闭的回调。
  3. 发送消息:通过_sendMessage方法发送消息到服务器。
  4. UI布局:使用TextFieldElevatedButton构建简单的UI,允许用户输入消息并发送到服务器,同时显示服务器的响应。

注意事项:

  • 确保服务器正在运行,并且IP地址和端口号正确。
  • 在实际应用中,可能需要处理更多的错误情况和重连逻辑。
  • 这个示例代码没有处理Socket的复杂情况,比如心跳包、自动重连等,你可能需要根据实际需求进行扩展。

希望这个示例能帮助你理解如何在Flutter项目中使用socket_connector进行网络通信。

回到顶部