簡體   English   中英

Flutter 與 Socket.io

[英]Flutter with Socket.io

我曾嘗試將 socket.io 與 flutter 一起使用。 但我收到以下錯誤。

D/FlutterSocketIoPlugin: SocketIO( 6279): reconnect_attempt: [108]
D/FlutterSocketIoPlugin: SocketIO( 6279): reconnecting: [108]
D/FlutterSocketIoPlugin: SocketIO( 6279): connect_error: [{"cause":{"detailMessage":"CLEARTEXT communication to 10.0.2.2 not permitted by network security policy","stackTrace":[],"suppressedExceptions":[]},"detailMessage":"websocket error","stackTrace":[],"suppressedExceptions":[]}]

我使用nodejs編寫了服務器。

const express = require('express');
const http = require('http');
const socketio = require('socket.io');
const { Socket } = require('dgram');
const formatMessage = require('./utils/messages');
const {userJoin, getCurrentUser, userLeave, getRoomUsers} = require('./utils/users');

const app = express();
const server = http.createServer(app);
const io = socketio(server);

const botName = 'ChatCordBot';

//run when client connects
io.on('connection', socket=>{

    socket.on('joinroom',({username, room})=>{

        const user = userJoin(socket.id, username, room);

        socket.join(user.room);

        socket.emit('message',formatMessage(botName,'Welcome to chatcord!'));

        //broadcast
        socket.broadcast.to(user.room).emit('message',formatMessage(botName,`${user.username} has joined`));

        //send users and room info
        io.to(user.room).emit('roomusers',{
            room:user.room,
            users:getRoomUsers(user.room)
        });
    }); 

    // Listen for chatMessage
    socket.on('chatMessage', msg => {
        // const user = getCurrentUser(socket.id);

        // io.to(user.room).emit('message', formatMessage(user.username, msg));
        console.log(msg);
    });

    //runs when client disconnects
    socket.on('disconnect',()=>{

        const user = userLeave(socket.id);

        if(user){
            io.to(user.room).emit('message',formatMessage(botName,`${user.username} has left the chat`));

            //send users and room info
            io.to(user.room).emit('roomusers',{
                room:user.room,
                users:getRoomUsers(user.room)
            });
        }
    });
});

const PORT = 3000;

server.listen(PORT,()=>{console.log(`Listening to ${PORT}`)});

這是我使用 socket.io 的客戶端的一部分。

import 'package:flutter_socket_io/flutter_socket_io.dart';
import 'package:flutter_socket_io/socket_io_manager.dart';


class Body extends StatefulWidget {
  const Body({
    Key key,
  }) : super(key: key);

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

class _BodyState extends State<Body> {
  SocketIO socketIO;
  @override
  // ignore: must_call_super
  void initState(){
    initSocketIO();
  }

  initSocketIO(){
    socketIO = SocketIOManager().createSocketIO('http://10.0.2.2:3000', '/');
    socketIO.init();

    socketIO.subscribe('chatMessage', getMessage);

    socketIO.connect();

  }

  getMessage(){
    if(socketIO != null){
      print("socket is not null");
    }
  }

我正在使用 android 工作室中的 android 仿真器運行我的 flutter 應用程序。 這是錯誤的原因嗎? 還是我的代碼中有錯誤?

在您的 AndroidManifest 文件中將使用明文流量屬性設置為 true,如下所示。

<application
....
android:usesCleartextTraffic="true"
....>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM