Flutter 三点四:Dart 使用ServerSocket/Socket写一个简单的聊天

使用ServerSocket/Socket写一个简单的聊天

  • ServerSocket 长连接服务器端
  • Socket 长连接客户端
  • 创建服务器端 ServerSocket.bind(IP, 端口) 返回Future对象
  • 创建客户端 Socket.connect(服务器的IP, 服务器端口) 返回 Future对象
  • serverSocket.listen 监听socket的连接对象
  • socket.listen 监听发送的数据对象
服务器端代码
import 'dart:convert';
import 'dart:io';

List sockets = []; //存储已连接的客户端socket
void main() {
  ServerSocket.bind("127.0.0.1", 4041).then((serverSocket) {
    serverSocket.listen((socket) {
      sockets.add(socket);
      // print(socket.runtimeType);
      // print(socket.address);
      // print(socket.port);
      socket.listen((event) {
        // print(event);  //原始数据byte数组
        String msg = utf8.decode(event);
        print("服务器收到的数据:${msg}"); //客户端发出的消息打印
        
        for (int i = 0; i < sockets.length; i++) {
          sockets[i].write("服务器转发的数据:${msg}"); //向某个客户端发出消息
        }
      });
      //也可用以下方式获取接收到的字符串
      //socket.cast 将byte数据转换为Stream
      // socket.cast>().transform(utf8.decoder).listen((event) {
      //     print(event);
      //     socket.write("Niyehaoa");
      // });
    });
  });
}


客户端1代码
import 'dart:convert';
import 'dart:io';

void main(){
  Socket.connect('127.0.0.1', 4041).then((socket) {
     socket.write('客户端1发送!');
     socket.cast>().transform(utf8.decoder).listen((event) {
       print("客户端1收到的数据:${event}");
     });
  });
}
客户端2代码
import 'dart:convert';
import 'dart:io';

void main() async{
  var mySocket = null;
  await Socket.connect('127.0.0.1', 4041).then((socket) {
     mySocket = socket;
     socket.cast>().transform(utf8.decoder).listen((event) {
       print("客户端2收到的数据:${event}");
     });
  });

  var i = 0;
  //每隔2s钟 发送一组字符串  真正的聊天程序会保持一个心跳帧 用来保持或判断连接是否断开
  Stream.periodic(Duration(seconds: 2))
  .listen((event) {
    if(mySocket != null){
      i++;
      mySocket.write('客户端2持续发送>>${i}');
    }
  });
}

结果

服务器端打印数据

Flutter 三点四:Dart 使用ServerSocket/Socket写一个简单的聊天_第1张图片

客户端1打印数据 收到了服务器转发的 客户端2发送的数据

Flutter 三点四:Dart 使用ServerSocket/Socket写一个简单的聊天_第2张图片

客户端2发送的数据

Flutter 三点四:Dart 使用ServerSocket/Socket写一个简单的聊天_第3张图片

其他

此实例无页面,等待flutter 控件时再撸
重新运行客户端时 需要重启服务器端否则会报错,因为sockets的连接已经不存在调用write会报错,请注意

你可能感兴趣的:(flutter,服务器,运维)