我正在尝试使用flutter应用客户端和go服务器创建一个服务器-客户端架构。目前,我正在尝试从flutter应用程序发送文本输入,以便使用Websockets在服务器端读取和打印。
我已经成功地测试了我的flutter应用程序从https://www.websocket.org/echo回声。为了连接到我的本地服务器,下面是相关的代码
用于连接到服务器
final channel = IOWebSocketChannel.connect('ws://localhost:8080/test');当为onPressed时,为了发送用户输入的数据,调用sendMessage();
void sendMessage(){
if(myController.text.isNotEmpty){
channel.sink.add(myController.text);
}
}我已经阅读了https://godoc.org/github.com/gorilla/websocket文档和其他博客,以了解mux、handlefunc和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))
}编辑:添加颤动客户端代码。
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);
}),
),
);
}
}发布于 2020-05-03 20:43:13
如果你在PC上运行Go服务器,但在手机/仿真器上运行Flutter应用程序,那么localhost将无法工作(它将指向手机/仿真器,而不是PC)。
您需要使用从电话解析到PC的IP地址/主机名,并确保Go服务器绑定到网络可访问的IP (并且没有防火墙)。
https://stackoverflow.com/questions/61544989
复制相似问题