|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
print("socket-listen: $proto");
|
|
|
|
MsgData data1 = MsgData.fromBuffer(proto.body);
|
|
|
|
print('收到来自:${data1.from},消息内容: ${utf8.decode(data1.data)} ');
|
|
|
|
|
|
|
|
hxDatabase.messageDao.insertMessage(createMessage(mobile, utf8.decode(data1.data), 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<Function> 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 = mobile
|
|
|
|
..token = token;
|
|
|
|
final authReqBytes = authReq.writeToBuffer();
|
|
|
|
final proto = Proto(1, 1, authReqBytes); // 假设 operation 和 seqId 为 1
|
|
|
|
final protoBytes = proto.toBytes();
|
|
|
|
_socket.add(protoBytes);
|
|
|
|
}
|
|
|
|
|
|
|
|
sendMessage(int toId, String content) {
|
|
|
|
if (!checkSocket()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Uint8List data = utf8.encode(content);
|
|
|
|
MsgData msgData = MsgData(to: toId, from: mobile, type: MsgType.SINGLE_TEXT,data: data);
|
|
|
|
final proto2 = Proto(5, 1, msgData.writeToBuffer());
|
|
|
|
_socket.add(proto2.toBytes());
|
|
|
|
hxDatabase.messageDao.insertMessage(createMessage(toId, content, userId: mobile)).catchError((error) {
|
|
|
|
debugPrint("insertMessage: $error");
|
|
|
|
});
|
|
|
|
debugPrint("insertMessage: end");
|
|
|
|
}
|
|
|
|
|
|
|
|
checkSocket() {
|
|
|
|
if (_socket == null) {
|
|
|
|
connect();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
get mobile => 123456;
|
|
|
|
|
|
|
|
|
|
|
|
}
|