client_server_lan 0.0.2 copy "client_server_lan: ^0.0.2" to clipboard
client_server_lan: ^0.0.2 copied to clipboard

outdated

A simple to use LAN communication package. A Server and a Client can be setup. Then the server broadcasts itself and connects to any listening clients. Data can then be transferred between each. The s [...]

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:wifi/wifi.dart';
import 'package:client_server_lan/client_server_lan.dart';

void main() async {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  ServerNode server;
  ClientNode client;
  bool dropdownEnabled = true;
  String serverStatus = "Server not running";
  String clientStatus = "Client not running";
  String clientIPs = "No devcies connected";
  String dataToSend = "Testing 1 2 3";
  String dataRecieved = "No response yet...";
  String clientToSend = "Moto g3 Client";
  String dropdownValue = "Server";

  void startServer() async {
    dropdownEnabled = false;
    String ip = await Wifi.ip;
    server = ServerNode(
      name: "Honor 9 Server",
      verbose: true,
      host: ip,
      port: 8085,
    );
    await server.init();
    setState(() {
      serverStatus = "Server running on ${server.host}:${server.port}";
    });
    await server.onReady;
    setState(() {
      serverStatus = "Server ready on ${server.host}:${server.port}";
    });
    server.dataResponse.listen((dynamic data) {
      setState(() {
        dataRecieved = data.toString();
      });
    });
  }

  void startClient() async {
    dropdownEnabled = false;
    String ip = await Wifi.ip;
    client = ClientNode(
      name: "Moto g3 Client",
      verbose: true,
      host: ip,
      port: 8085,
    );
    await client.init();
    setState(() {
      clientStatus = "Client running on ${client.host}:${client.port}";
    });
    await client.onReady;
    setState(() {
      clientStatus = "Client ready on ${client.host}:${client.port}";
    });
    client.dataResponse.listen((dynamic data) {
      setState(() {
        dataRecieved = data.toString();
      });
    });
  }

  void findClients() async {
    server.discoverNodes();
    await Future<dynamic>.delayed(const Duration(seconds: 2));
    clientIPs = "";
    for (final s in server.clientsConnected) {
      setState(() {
        clientIPs += "id=${s.name},IP=${s.address}\n";
      });
    }
  }

  void clientToServer() async {
    await client.sendData(dataToSend, client.serverDetails.address);
  }

  void serverToClient(String clientName) async {
    final String client = server.clientUri(clientName);
    await server.sendData(dataToSend, client);
  }

  void disposeClient() {
    client.dispose();
    setState(() {
      clientStatus = "Client not running";
    });
    dropdownEnabled = true;
  }

  void disposeServer() {
    server.dispose();
    setState(() {
      serverStatus = "Server not running";
    });
    dropdownEnabled = true;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ListView(
          children: <Widget>[
            DropdownButton<String>(
              value: dropdownValue,
              icon: Icon(Icons.arrow_downward),
              iconSize: 24,
              elevation: 16,
              style: TextStyle(color: Colors.deepPurple),
              underline: Container(
                height: 2,
                color: Colors.deepPurpleAccent,
              ),
              onChanged: (String newValue) {
                if (dropdownEnabled) {
                  setState(() {
                    dropdownValue = newValue;
                  });
                }
              },
              items: <String>["Server", "Client"]
                  .map<DropdownMenuItem<String>>((String value) {
                return DropdownMenuItem<String>(
                  value: value,
                  child: Text(value),
                );
              }).toList(),
            ),
            dropdownValue == "Server"
                ? Column(
                    children: <Widget>[
                      Text(serverStatus),
                      RaisedButton(
                        child: Text("Start Server"),
                        onPressed: () => startServer(),
                      ),
                      RaisedButton(
                        child: Text("Scan Clients"),
                        onPressed: () => findClients(),
                      ),
                      Text(clientIPs),
                      TextField(
                        decoration: InputDecoration(
                            labelText: "Client to send data to",
                            border: InputBorder.none,
                            contentPadding: EdgeInsets.all(20)),
                        onChanged: (String text) {
                          setState(() {
                            clientToSend = text;
                          });
                        },
                      ),
                    ],
                  )
                : Column(
                    children: <Widget>[
                      Text(clientStatus),
                      RaisedButton(
                        child: Text("Start Client"),
                        onPressed: () => startClient(),
                      ),
                    ],
                  ),
            TextField(
              decoration: InputDecoration(
                  labelText: "Data to send",
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.all(20)),
              onChanged: (String text) {
                setState(() {
                  dataToSend = text;
                });
              },
            ),
            RaisedButton(
              child: Text("Send Data"),
              onPressed: () => dropdownValue == "Server"
                  ? serverToClient(clientToSend)
                  : clientToServer(),
            ),
            Text(dataRecieved),
            RaisedButton(
              child: Text("Dispose $dropdownValue"),
              onPressed: () =>
                  dropdownValue == "Server" ? disposeServer() : disposeClient(),
            ),
          ],
        ),
      ),
    );
  }
}
18
likes
0
pub points
0%
popularity

Publisher

unverified uploader

A simple to use LAN communication package. A Server and a Client can be setup. Then the server broadcasts itself and connects to any listening clients. Data can then be transferred between each. The server and client can then disconnect when ready.

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

dio, emodebug, err, extra_pedantic, isohttpd, meta, pedantic, prompts, uuid

More

Packages that depend on client_server_lan