首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法将websocket数据从flutter应用程序发送到go服务器

无法将websocket数据从flutter应用程序发送到go服务器
EN

Stack Overflow用户
提问于 2020-05-01 23:00:40
回答 1查看 2.3K关注 0票数 0

我正在尝试使用flutter应用客户端和go服务器创建一个服务器-客户端架构。目前,我正在尝试从flutter应用程序发送文本输入,以便使用Websockets在服务器端读取和打印。

我已经成功地测试了我的flutter应用程序从https://www.websocket.org/echo回声。为了连接到我的本地服务器,下面是相关的代码

用于连接到服务器

代码语言:javascript
运行
复制
  final channel = IOWebSocketChannel.connect('ws://localhost:8080/test');

当为onPressed时,为了发送用户输入的数据,调用sendMessage();

代码语言:javascript
运行
复制
void sendMessage(){
    if(myController.text.isNotEmpty){
      channel.sink.add(myController.text);
    }
  }

我已经阅读了https://godoc.org/github.com/gorilla/websocket文档和其他博客,以了解mux、handlefunc和listenandserve函数,但我无法发送数据。

这是我的Go服务器:

代码语言:javascript
运行
复制
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))

}

编辑:添加颤动客户端代码。

代码语言:javascript
运行
复制
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);
        }),
      ),
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-03 20:43:13

如果你在PC上运行Go服务器,但在手机/仿真器上运行Flutter应用程序,那么localhost将无法工作(它将指向手机/仿真器,而不是PC)。

您需要使用从电话解析到PC的IP地址/主机名,并确保Go服务器绑定到网络可访问的IP (并且没有防火墙)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61544989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档