|
|
@ -4,6 +4,8 @@ import 'dart:core'; |
|
|
|
import 'dart:core'; |
|
|
|
import 'dart:core'; |
|
|
|
import 'dart:io'; |
|
|
|
import 'dart:io'; |
|
|
|
import 'package:flutter/foundation.dart'; |
|
|
|
import 'package:flutter/foundation.dart'; |
|
|
|
|
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
|
|
|
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; |
|
|
|
import 'package:huixiang/im/Proto.dart'; |
|
|
|
import 'package:huixiang/im/Proto.dart'; |
|
|
|
import 'package:huixiang/im/database/message.dart'; |
|
|
|
import 'package:huixiang/im/database/message.dart'; |
|
|
|
import 'package:huixiang/im/out/auth.pb.dart'; |
|
|
|
import 'package:huixiang/im/out/auth.pb.dart'; |
|
|
@ -17,11 +19,17 @@ class SocketClient { |
|
|
|
final String ip = kDebugMode ? '192.168.10.129' : '47.93.216.24'; |
|
|
|
final String ip = kDebugMode ? '192.168.10.129' : '47.93.216.24'; |
|
|
|
final num port = 9090; |
|
|
|
final num port = 9090; |
|
|
|
Socket _socket; |
|
|
|
Socket _socket; |
|
|
|
SharedPreferences shared; |
|
|
|
SharedPreferences _shared; |
|
|
|
|
|
|
|
|
|
|
|
connect() async { |
|
|
|
connect() async { |
|
|
|
shared = await SharedPreferences.getInstance(); |
|
|
|
_shared = await SharedPreferences.getInstance(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (_socket != null) { |
|
|
|
|
|
|
|
reconnect(); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
showDebugToast("socket-connect .... "); |
|
|
|
await Socket.connect(ip, port).then((value) { |
|
|
|
await Socket.connect(ip, port).then((value) { |
|
|
|
debugPrint("socket-connect-$ip"); |
|
|
|
debugPrint("socket-connect-$ip"); |
|
|
|
_socket = value; |
|
|
|
_socket = value; |
|
|
@ -34,10 +42,9 @@ class SocketClient { |
|
|
|
|
|
|
|
|
|
|
|
Map<String, dynamic> messageMap = createMessage(userId, utf8.decode(dataResult.data), msgType: dataResult.type.value, userId: dataResult.from); |
|
|
|
Map<String, dynamic> messageMap = createMessage(userId, utf8.decode(dataResult.data), msgType: dataResult.type.value, userId: dataResult.from); |
|
|
|
Message message = Message.fromJson(messageMap); |
|
|
|
Message message = Message.fromJson(messageMap); |
|
|
|
callbacks[userId]?.call(message); /// user self conversation callback |
|
|
|
callbacks[userId]?.call(message); /// user self conversation list callback |
|
|
|
|
|
|
|
|
|
|
|
if (callbacks[dataResult.from] != null) { |
|
|
|
if (callbacks[dataResult.from] != null) { |
|
|
|
// |
|
|
|
|
|
|
|
messageMap["state"] = 1; |
|
|
|
messageMap["state"] = 1; |
|
|
|
message.state = 1; |
|
|
|
message.state = 1; |
|
|
|
callbacks[dataResult.from].call(message); /// user conversation callback |
|
|
|
callbacks[dataResult.from].call(message); /// user conversation callback |
|
|
@ -47,27 +54,35 @@ class SocketClient { |
|
|
|
|
|
|
|
|
|
|
|
}, onError: (Object error, StackTrace stackTrace) { |
|
|
|
}, onError: (Object error, StackTrace stackTrace) { |
|
|
|
debugPrint("socket-listen-error: $error, stackTrace: $stackTrace"); |
|
|
|
debugPrint("socket-listen-error: $error, stackTrace: $stackTrace"); |
|
|
|
|
|
|
|
showDebugToast("socket-listen-error: $error, stackTrace: $stackTrace"); |
|
|
|
reconnect(); |
|
|
|
reconnect(); |
|
|
|
}, onDone: () { |
|
|
|
}, onDone: () { |
|
|
|
debugPrint("socket-listen-down: down"); |
|
|
|
debugPrint("socket-listen-down: down"); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
authRequest(shared.getString("token")); |
|
|
|
authRequest(_shared.getString("token")); |
|
|
|
|
|
|
|
|
|
|
|
heartbeat(); |
|
|
|
heartbeat(); |
|
|
|
}).catchError((error) { |
|
|
|
}).catchError((error) { |
|
|
|
debugPrint("socket-connect-error: $error"); |
|
|
|
debugPrint("socket-connect-error: $error"); |
|
|
|
|
|
|
|
showDebugToast("socket-connect-error: $error"); |
|
|
|
reconnectTime = 1500; |
|
|
|
reconnectTime = 1500; |
|
|
|
_socket = null; |
|
|
|
_socket = null; |
|
|
|
reconnect(); |
|
|
|
reconnect(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
showDebugToast(text) { |
|
|
|
|
|
|
|
if (kDebugMode) { |
|
|
|
|
|
|
|
SmartDialog.showToast(text, alignment: Alignment.center); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
heartbeat() { |
|
|
|
heartbeat() { |
|
|
|
Timer.periodic(const Duration(milliseconds: 30000), (timer) { |
|
|
|
Timer.periodic(const Duration(milliseconds: 30000), (timer) { |
|
|
|
int milliseTime = DateTime.now().millisecondsSinceEpoch; |
|
|
|
int millisecondsTime = DateTime.now().millisecondsSinceEpoch; |
|
|
|
debugPrint("heartbeat: ${milliseTime}"); |
|
|
|
debugPrint("heartbeat: $millisecondsTime"); |
|
|
|
Uint8List data = utf8.encode(jsonEncode({"heartbeat": milliseTime})); |
|
|
|
Uint8List data = utf8.encode(jsonEncode({"heartbeat": millisecondsTime})); |
|
|
|
MsgData msgData = MsgData(from: userId, type: MsgType.TEXT, data: data); |
|
|
|
MsgData msgData = MsgData(from: userId, type: MsgType.TEXT, data: data); |
|
|
|
final proto2 = Proto(3, 1, msgData.writeToBuffer()); |
|
|
|
final proto2 = Proto(3, 1, msgData.writeToBuffer()); |
|
|
|
if(!checkSocket()) { |
|
|
|
if(!checkSocket()) { |
|
|
@ -78,10 +93,10 @@ class SocketClient { |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int reconnectTime = 600; |
|
|
|
int reconnectTime = 1500; |
|
|
|
|
|
|
|
|
|
|
|
reconnect() { |
|
|
|
reconnect() { |
|
|
|
Future.delayed(Duration(milliseconds: reconnectTime *= 2), () { |
|
|
|
Future.delayed(Duration(milliseconds: reconnectTime), () { |
|
|
|
dispose(); |
|
|
|
dispose(); |
|
|
|
connect(); |
|
|
|
connect(); |
|
|
|
}); |
|
|
|
}); |
|
|
@ -148,6 +163,6 @@ class SocketClient { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
String get userId => shared.getString("userId"); |
|
|
|
String get userId => _shared.getString("userId"); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |