Невозможно отправить данные веб-сокета из приложения флаттера на сервер go - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать архитектуру сервер-клиент, используя клиент приложения flutter и go сервер. В настоящее время я пытаюсь отправить ввод текста из приложения флаттера, прочитать и распечатать его на стороне сервера с помощью веб-сокетов.

Я успешно проверил мое приложение флаттера на эхо от https://www.websocket.org/echo. Чтобы подключиться к моему локальному серверу, вот соответствующий бит

Для подключения к серверу

  final channel = IOWebSocketChannel.connect('ws://localhost:8080/test');

При нажатии для отправки введенных пользователем данных вызывается sendMessage ();

void sendMessage(){
    if(myController.text.isNotEmpty){
      channel.sink.add(myController.text);
    }
  }

Я прочитал https://godoc.org/github.com/gorilla/websocket документы и другие блоги, чтобы понять функции mux, handlefun c и listenandserve, но я не могу отправлять данные.

Вот мой Go сервер:

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
        ReadBufferSize: 1024,
    }

func connectionHandler(w http.ResponseWriter, r *http.Request){
    conn, err := upgrader.Upgrade(w,r,nil)
    if err != nil {
        log.Println(err)
        return
    }

    for{
            messageType, p, err := conn.NextReader()
            fmt.Println(p)
            fmt.Println(messageType)
            if err != nil {
                log.Println(err)
                return
            }
    }

}

func main(){

    mux := http.NewServeMux()
    fmt.Printf("Connecting to server \n")

    mux.HandleFunc("/test", connectionHandler)

    log.Fatal(http.ListenAndServe(":8080", mux))

}

Редактировать: Добавлен код клиента Flutter.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:web_socket_channel/html.dart';
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/status.dart' as status;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Shopping',
      initialRoute: 'home',
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
      ),
      routes: <String, WidgetBuilder>{
        'home': (BuildContext context) => HomePage(title: "Home"),
        '/shoppingpage': (BuildContext context) => ShoppingCart(title: "Shopping Cart Page"),
      },

    );
  }
}

class HomePage extends StatelessWidget {
  HomePage({Key key, this.title}) : super(key:key);
  final String title;
  final channel = IOWebSocketChannel.connect('ws://localhost:8080/test');
  TextEditingController myController = TextEditingController();
  final GlobalKey<ScaffoldState> _scaffoldkey = new GlobalKey<ScaffoldState>();

  @override
  void dispose(){
    myController.dispose();
    channel.sink.close();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldkey,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          FlatButton(
              onPressed: (){
                return (Navigator.of(context).pushNamed('/shoppingpage'));
              },
              child: Text('Start Game'),
              color: Colors.blue,
              splashColor: Colors.green,

          ),

          TextField(
            controller: myController,

          ),

          FloatingActionButton(
            onPressed: (){
              sendMessage();
              _scaffoldkey.currentState.showSnackBar(SnackBar(
                content: Text('Sent'),
              ));
            },
            child: Icon(Icons.send),
          ),

          StreamBuilder(
            stream: channel.stream,
            builder: (context, snapshot){
              return snapshot.hasData ? Text(snapshot.data.toString(),
              ) : CircularProgressIndicator();
            }
          ),
        ],
      ),
    );
  }

  void sendMessage(){
    if(myController.text.isNotEmpty){
      channel.sink.add(myController.text);
    }
  }

}



class ShoppingCart extends StatelessWidget {
  ShoppingCart({Key key, this.title}) : super(key: key);
  final String title;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: BackButton(onPressed: (){
          return Navigator.pop(context);
        }),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 03 мая 2020

Если вы используете сервер Go на вашем P C, а приложение Flutter на мобильном / эмуляторе, то localhost не будет работать (оно будет указывать на мобильный / эмулятор, а не P C).

Вам нужно будет использовать IP-адрес / имя хоста, которое разрешает P C с телефона, и убедиться, что сервер Go привязан к доступному по сети IP. (и что в пути нет брандмауэра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...