import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:huixiang/im/Proto.dart'; import 'package:huixiang/im/database/message.dart'; import 'package:huixiang/im/out/auth.pb.dart'; import 'package:huixiang/im/out/message.pb.dart'; import 'package:huixiang/main.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SocketClient { Socket _socket; SharedPreferences shared; connect() async { shared = await SharedPreferences.getInstance(); await Socket.connect('192.168.10.129', 9090).then((value) { debugPrint("socket-connect"); _socket = value; _socket.listen((data) { print(data); print("socket-listen"); Proto proto = Proto.fromBytes(data); MsgData data1 = MsgData.fromBuffer(proto.body); print('收到来自:${data1.from},消息内容: ${utf8.decode(data1.data)} '); hxDatabase.insert(createMessage(userId, utf8.decode(data1.data), msgType: data1.type.value, userId: data1.from)); callbacks.forEach((callback) { callback.call(data1); }); }, onError: (Object error, StackTrace stackTrace) { debugPrint("socket-error: $error, stackTrace: ${stackTrace}"); }); authRequest(shared.getString("token")); }).catchError((error) { debugPrint("socket-connect-error: $error"); }); } List callbacks = []; addCallback(Function callback) { callbacks.add(callback); } removeCallback(Function callback) { callbacks.remove(callback); } dispose() { _socket.close(); } authRequest(String token) { if (!checkSocket()) { return; } final authReq = AuthReq() ..uid = userId ..token = token; final authReqBytes = authReq.writeToBuffer(); final proto = Proto(1, 1, authReqBytes); // 假设 operation 和 seqId 为 1 final protoBytes = proto.toBytes(); _socket.add(protoBytes); } Future sendMessage(String toId, String content) async { Map message = createMessage(toId, content, userId: userId); int id = await hxDatabase.insert(message).catchError((error) { debugPrint("insertMessage: $error"); }); if (!checkSocket()) { hxDatabase.update({"id": id, "state": 3}).catchError((error) { debugPrint("insertMessage: $error"); }); message["id"] = id; message["state"] = 3; return Message.fromJson(message); } message["id"] = id; Uint8List data = utf8.encode(content); MsgData msgData = MsgData(to: toId, from: userId, type: MsgType.SINGLE_TEXT, data: data); final proto2 = Proto(5, 1, msgData.writeToBuffer()); _socket.add(proto2.toBytes()); debugPrint("sendMessage: ${message["id"]}"); return Message.fromJson(message); } checkSocket() { if (_socket == null) { connect(); return false; } return true; } get userId => shared.getString("userId"); }