Flutter TCP Client socket: когда я подключаюсь? - PullRequest
0 голосов
/ 19 апреля 2020

Я ссылаюсь на этот вопрос stackoverflow Использование Socket в приложениях Flutter? и, в частности, я воспроизводлю ответ, предоставленный пользователем Attilio Dona (attdona).

Код работает (я проверял код на устройствах iPhone и Android).

Я могу подключиться к серверу TCP, работающему на встроенном устройстве, и отправить сообщение.

ВОПРОС - После ввода следующей команды

Socket sock = await Socket.connect('192.168.1.129', 10000);

Что я отслеживаю, чтобы убедиться, что сокет действительно может передавать данные?

По следам и ошибкам после подключения мне приходится ждать от 20 до 40 секунд, прежде чем я смогу отправлять данные. Что я могу контролировать программно?

Ниже приведен код пользователя 'Attdona'

import 'package:flutter/foundation.dart';
import 'dart:io';
import 'package:flutter/material.dart';

void main() async {
   // modify with your true address/port
   Socket sock = await Socket.connect('192.168.1.129', 10000);
   runApp(MyApp(sock));
}

class MyApp extends StatelessWidget {
   Socket socket;

   MyApp(Socket s) {
   this.socket = s;
}

@override
Widget build(BuildContext context) {
   final title = 'TcpSocket Demo';
   return MaterialApp(
      title: title,
      home: MyHomePage(
         title: title,
         channel: socket,
      ),
   );}
}

class MyHomePage extends StatefulWidget {
   final String title;
   final Socket channel;

   MyHomePage({Key key, @required this.title, @required this.channel})
      : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
   TextEditingController _controller = TextEditingController();

   @override
   Widget build(BuildContext context) {

      return Scaffold(
         appBar: AppBar(
            title: Text(widget.title),
         ),
         body: Padding(
            padding: const EdgeInsets.all(20.0),
            child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
               Form(
                  child: TextFormField(
                     controller: _controller,
                     decoration: InputDecoration(labelText: 'Send a message'),
                  ),
               ),
               StreamBuilder(
                  stream: widget.channel,
                  builder: (context, snapshot) {
                     return Padding(
                        padding: const EdgeInsets.symmetric(vertical: 24.0),
                        child: Text(snapshot.hasData
                              ? '${String.fromCharCodes(snapshot.data)}'
                              : ''),
                     );
                  },
               )
            ],
         ),
      ),
      floatingActionButton: FloatingActionButton(
         onPressed: _sendMessage,
         tooltip: 'Send message',
         child: Icon(Icons.send),
      ), // This trailing comma makes auto-formatting nicer for build methods.
   );
}

void _sendMessage() {
   if (_controller.text.isNotEmpty) {
     widget.channel.write(_controller.text);
   }
}

@override
  void dispose() {
     widget.channel.close();
     super.dispose();
  }

}

РЕДАКТИРОВАТЬ

(Android): Некоторое уточнение ... На смартфоне после подключения вручную к точке доступа, созданной встроенным устройством, мне нужно подождать, пока смартфон не выдаст следующее сообщение: «Inte rnet может быть недоступно». Только после появления этого сообщения я могу запустить приложение и установить sh успешной передачи (отсюда 20-40 секунд). На iOS я даже не получаю вышеуказанное предупреждение. Поэтому я просто подожду минуту или около того ...

Как будто целевая точка доступа, отображаемая как "Текущая сеть", не является достаточной, чтобы гарантировать, что любая обработка / согласование, происходящее за сценой, действительно завершено. Что я должен контролировать, прежде чем пытаться подключить сокет TCP?

...