node.jsfluttersocket.io

Why my Flutter app does not connect to my local nodejs server?


I'm learning nodejs and I want to create real time communication between flutter app and nodejs server. Both working on local.

This is my socket.js file. I'm using express and socket io. (Express for later. For Rest)

const app = require('express')()
const http = require('http').createServer(app)


app.get('/', (req, res) => {
    res.send("Server is running")
})

//Socket Logic
const socketio = require('socket.io')(http)

socketio.on("connection", (userSocket) => {
  console.log('a user connected');
    userSocket.on("message", (data) => {
        userSocket.broadcast.emit("receive_message", data)
    })
})

http.listen(3000,(s)=>{
  console.log("server is listening at 3000");
});

My Flutter which use socket_io_client package. When I run my app nothing happend and there is no connection between them.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;

String uri = 'http://localhost:3000';
void main() {
  runApp(MyApp());
}

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

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

class _MyAppState extends State<MyApp> {
  String message;
  IO.Socket socket;
  StreamController<String> _socketResponse;
  @override
  void initState() {
    super.initState();
    _socketResponse = StreamController();

    socket = IO.io(
        'http://locaost:3000',
        IO.OptionBuilder()
            .setTransports(['websocket']) // for Flutter or Dart VM
            .setExtraHeaders({'foo': 'bar'}) // optional
            .build());

    socket.onConnect((data) {
      print('connectend');
      print(data);
      socket.emit('message', 'tester');
    });

    socket.on('event', (data) => _socketResponse.sink.add(data));

    message = 'Hello ';
  }

  @override
  void dispose() {
    _socketResponse.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: StreamBuilder<String>(
            stream: _socketResponse.stream,
            builder: (context, snapshot) {
              return Center(
                child: Text(snapshot.data ?? socket.connected.toString()),
              );
            }),
      ),
    );
  }
}

Edit: I upload my server files to Heroku and now it is working. I think there is a problem at network policy.


Solution

  • I found the problem. Socket-io-client is working with version 2 but my server use socketio version 3. I downgrade my version 3 to 2.