颤振流套接字

Posted

技术标签:

【中文标题】颤振流套接字【英文标题】:Flutter streamsocket 【发布时间】:2021-12-11 16:37:51 【问题描述】:

我在从流套接字读取数据时遇到问题。 在 websocket 调用中接收到数据后,我想将我所有的内容放在一个变量中并开始使用该变量。相反,我只能打印应用程序正文中的最后一个字符串行。要进行套接字连接,我使用 socket.io-client 依赖版本 ^1.0.1 并且它可以工作。问题是下一步,如何从socket中获取数据。

我可以打印 StreamSocket 的所有内容吗?

import 'package:flutter/material.dart';
import 'package:vincenzakart/widget/navigationdrawerwidget.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
import 'dart:async';
import 'dart:io';

class PilotiPage extends StatefulWidget 
  const PilotiPage(Key? key) : super(key: key);

  @override
  PilotiPageState createState() => PilotiPageState();


StreamSocket streamSocket = StreamSocket();
var datiDaServer;

class PilotiPageState extends State<PilotiPage> 
  @override
  void initState() 
    super.initState();
    initSocket();
  

  @override
  Widget build(BuildContext context) => Scaffold(
        drawer: const NavigationDrawerWidget(),
        appBar: AppBar(
          title: const Text('Piloti'),
          centerTitle: true,
          backgroundColor: Colors.black12,
        ),
        body: Container(
          child: StreamBuilder(
            stream: streamSocket.getResponse,
            builder: (BuildContext context, AsyncSnapshot<String> snapshot) 
              return Column(
                children: [
                  Text(datiDaServer.toString()),
                ],
              );
            ,
          ),
        ),
      );


@override
void initSocket() 
  connectAndListen();


// 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();
  



void connectAndListen() 
  IO.Socket socket = IO.io('http://192.168.110.204:3999',
      IO.OptionBuilder().setTransports(['websocket']).build());

  socket.connect();
  socket.onConnect((_) 
    print('connect socket.io');
    print(socket.id);
  );

  //When an event recieved from server, data is added to the stream
  socket.on('message', (data) => streamSocket.addResponse);
  socket.on('message', (data) 
    print(data.toString());
    print(data.toString().length);
    datiDaServer = data;
  );

  socket.onDisconnect((_) => print('disconnect'));

【问题讨论】:

【参考方案1】:

我得到了我想要做一点改变的回应。在我写的变量声明中:

String datiDaServer = ''

而不是var datiDaServer

在函数 void connectAndListen() 中我写了 datiDaServer += data.toString(); 而不是 datiDaServer = data.toString()

我知道这是一种非常肮脏的方式,但目前可以很好地完成我必须做的事情。

【讨论】:

以上是关于颤振流套接字的主要内容,如果未能解决你的问题,请参考以下文章

颤振在尝试查找包 android_alarm_manager 时遇到套接字错误:^0.1.0

关闭套接字会关闭流吗?

网络通信中基于套接字输入流和输出流的创建

将套接字资源转换为流套接字

从套接字流读取时是不是需要线程睡眠?

通过套接字流发送对象