Я пытаюсь создать архитектуру сервер-клиент, используя клиент приложения 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);
}),
),
);
}
}