diff --git a/assets/csharp/MessageCommon.cs b/assets/csharp/MessageCommon.cs index 8bc7fd6..66f0a53 100644 --- a/assets/csharp/MessageCommon.cs +++ b/assets/csharp/MessageCommon.cs @@ -24,14 +24,14 @@ public static partial class MessageCommonReflection { string.Concat( "ChRtZXNzYWdlX2NvbW1vbi5wcm90byI7CgpQYWNrZXRCYXNlEhAKCHR5cGVO", "YW1lGAEgASgJEg0KBW5vbmNlGAIgASgFEgwKBGRhdGEYAyABKAwiCwoJSGVh", - "cnRCZWF0Ii4KDFRlbXBsYXRlRGF0YRINCgVpbmRleBgBIAEoBRIPCgdtZXNz", - "YWdlGAIgASgJYgZwcm90bzM=")); + "cnRCZWF0IioKCFRlc3REYXRhEg0KBWluZGV4GAEgASgFEg8KB21lc3NhZ2UY", + "AiABKAliBnByb3RvMw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PacketBase), global::PacketBase.Parser, new[]{ "TypeName", "Nonce", "Data" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::HeartBeat), global::HeartBeat.Parser, null, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::TemplateData), global::TemplateData.Parser, new[]{ "Index", "Message" }, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::TestData), global::TestData.Parser, new[]{ "Index", "Message" }, null, null, null, null) })); } #endregion @@ -324,11 +324,11 @@ public sealed partial class HeartBeat : pb::IMessage { } -public sealed partial class TemplateData : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new TemplateData()); +public sealed partial class TestData : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new TestData()); private pb::UnknownFieldSet _unknownFields; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } + public static pb::MessageParser Parser { get { return _parser; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public static pbr::MessageDescriptor Descriptor { @@ -341,22 +341,22 @@ public sealed partial class TemplateData : pb::IMessage { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TemplateData() { + public TestData() { OnConstruction(); } partial void OnConstruction(); [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TemplateData(TemplateData other) : this() { + public TestData(TestData other) : this() { index_ = other.index_; message_ = other.message_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TemplateData Clone() { - return new TemplateData(this); + public TestData Clone() { + return new TestData(this); } /// Field number for the "index" field. @@ -383,11 +383,11 @@ public sealed partial class TemplateData : pb::IMessage { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { - return Equals(other as TemplateData); + return Equals(other as TestData); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(TemplateData other) { + public bool Equals(TestData other) { if (ReferenceEquals(other, null)) { return false; } @@ -446,7 +446,7 @@ public sealed partial class TemplateData : pb::IMessage { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(TemplateData other) { + public void MergeFrom(TestData other) { if (other == null) { return; } diff --git a/assets/protobuf/message_common.proto b/assets/protobuf/message_common.proto index 54acc92..4efcae2 100644 --- a/assets/protobuf/message_common.proto +++ b/assets/protobuf/message_common.proto @@ -8,7 +8,7 @@ message PacketBase { message HeartBeat {} -message TemplateData { +message TestData { int32 index = 1; string message = 2; } \ No newline at end of file diff --git a/lib/socket/packets/message_common.pb.dart b/lib/socket/packets/message_common.pb.dart index 9c63a57..059eb0c 100644 --- a/lib/socket/packets/message_common.pb.dart +++ b/lib/socket/packets/message_common.pb.dart @@ -123,8 +123,8 @@ class HeartBeat extends $pb.GeneratedMessage { static HeartBeat? _defaultInstance; } -class TemplateData extends $pb.GeneratedMessage { - factory TemplateData({ +class TestData extends $pb.GeneratedMessage { + factory TestData({ $core.int? index, $core.String? message, }) { @@ -137,11 +137,11 @@ class TemplateData extends $pb.GeneratedMessage { } return $result; } - TemplateData._() : super(); - factory TemplateData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory TemplateData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + TestData._() : super(); + factory TestData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TestData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TemplateData', createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TestData', createEmptyInstance: create) ..a<$core.int>(1, _omitFieldNames ? '' : 'index', $pb.PbFieldType.O3) ..aOS(2, _omitFieldNames ? '' : 'message') ..hasRequiredFields = false @@ -151,22 +151,22 @@ class TemplateData extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - TemplateData clone() => TemplateData()..mergeFromMessage(this); + TestData clone() => TestData()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - TemplateData copyWith(void Function(TemplateData) updates) => super.copyWith((message) => updates(message as TemplateData)) as TemplateData; + TestData copyWith(void Function(TestData) updates) => super.copyWith((message) => updates(message as TestData)) as TestData; $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static TemplateData create() => TemplateData._(); - TemplateData createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static TestData create() => TestData._(); + TestData createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TemplateData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static TemplateData? _defaultInstance; + static TestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TestData? _defaultInstance; @$pb.TagNumber(1) $core.int get index => $_getIZ(0); diff --git a/lib/socket/packets/message_common.pbjson.dart b/lib/socket/packets/message_common.pbjson.dart index ee7be7b..6687246 100644 --- a/lib/socket/packets/message_common.pbjson.dart +++ b/lib/socket/packets/message_common.pbjson.dart @@ -37,17 +37,17 @@ const HeartBeat$json = { final $typed_data.Uint8List heartBeatDescriptor = $convert.base64Decode( 'CglIZWFydEJlYXQ='); -@$core.Deprecated('Use templateDataDescriptor instead') -const TemplateData$json = { - '1': 'TemplateData', +@$core.Deprecated('Use testDataDescriptor instead') +const TestData$json = { + '1': 'TestData', '2': [ {'1': 'index', '3': 1, '4': 1, '5': 5, '10': 'index'}, {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'}, ], }; -/// Descriptor for `TemplateData`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List templateDataDescriptor = $convert.base64Decode( - 'CgxUZW1wbGF0ZURhdGESFAoFaW5kZXgYASABKAVSBWluZGV4EhgKB21lc3NhZ2UYAiABKAlSB2' - '1lc3NhZ2U='); +/// Descriptor for `TestData`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List testDataDescriptor = $convert.base64Decode( + 'CghUZXN0RGF0YRIUCgVpbmRleBgBIAEoBVIFaW5kZXgSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2' + 'FnZQ=='); diff --git a/lib/socket/protobuf_client.dart b/lib/socket/protobuf_client.dart index 9304a9c..7630d81 100644 --- a/lib/socket/protobuf_client.dart +++ b/lib/socket/protobuf_client.dart @@ -13,77 +13,75 @@ import 'package:dart_framework/socket/packets/message_common.pb.dart'; abstract class ProtobufClient extends Communicator { final int _headerSize = 4; - final int _heartbeatBuffer = 10; - final int _heartbeatTime; + final int _heartbeatIntervalTime; + final int _heartbeatWaitTime; final Socket _socket; - late Timer? _heartbeatTimer = null; + late ResponseChecker? _heartbeatChecker; int? _length = null; bool _isAlive = false; late List _arrivedData = []; List _onDisconnectListenerList = []; - ProtobufClient(this._socket, this._heartbeatTime, Map)> parserMap) - { + ProtobufClient(this._socket, this._heartbeatIntervalTime, this._heartbeatWaitTime, Map)> parserMap) { print('Connected New Client'); _isAlive = true; parserMap.addAll({ - (TemplateData).toString() : TemplateData.fromBuffer, + (TestData).toString() : TestData.fromBuffer, (HeartBeat).toString() : HeartBeat.fromBuffer }); super.initialize(parserMap); addListener(onHeartBeat); _socket.listen(onData, onError: onError) .asFuture().then(onDisconnected); - // waitHeartbeat(); + sendHeartBeat(); } - void waitHeartbeat() - { - _heartbeatTimer = Timer(Duration(seconds: _heartbeatTime + _heartbeatBuffer), () { - dispose(); + void sendHeartBeat() { + _heartbeatChecker?.responsed(); + _heartbeatChecker = ResponseChecker.seecond(this, _heartbeatIntervalTime, (client) { + send(HeartBeat()); + _heartbeatChecker = ResponseChecker.seecond(this, _heartbeatWaitTime, (client) { + dispose(); + onDisconnected(null); + }); }); } - void onHeartBeat(HeartBeat data) - { - _heartbeatTimer?.cancel(); - waitHeartbeat(); + void onHeartBeat(HeartBeat data) { + sendHeartBeat(); } - void addDisconnectListener(void Function(ProtobufClient) handler) - { + void addDisconnectListener(void Function(ProtobufClient) handler) { if(!_onDisconnectListenerList.contains(handler)) { _onDisconnectListenerList.add(handler); } } - void removeDisconnectListener(void Function(ProtobufClient) handler) - { + void removeDisconnectListener(void Function(ProtobufClient) handler) { if(_onDisconnectListenerList.contains(handler)) { _onDisconnectListenerList.remove(handler); } } - void onDisconnected(dynamic data) - { + void onDisconnected(dynamic data) { //client disconnected for (var item in _onDisconnectListenerList) { item.call(this); } + _onDisconnectListenerList.clear(); } - void onError(dynamic e) - { + void onError(dynamic e) { print('=========> onError: $e'); } - void onData(Uint8List data) async - { + void onData(Uint8List data) async { try { + sendHeartBeat(); // printPacket('## Received', data); if(_length == null) { @@ -130,8 +128,7 @@ abstract class ProtobufClient extends Communicator return simpleFuture; } - void printPacket(String prefix, List packet) - { + void printPacket(String prefix, List packet) { var s = StringBuffer(); for(var item in packet) { @@ -140,9 +137,32 @@ abstract class ProtobufClient extends Communicator print('$prefix: ${s.toString()}'); } - void dispose() - { - _isAlive = false; - _socket.close(); + void dispose() async { + if(_isAlive) + { + _isAlive = false; + _heartbeatChecker?.responsed(); + await _socket.close(); + _socket.destroy(); + } } } + +class ResponseChecker { + final T _responser; + late Timer _timer; + ResponseChecker(this._responser, int time, void Function(T) notResponseListener) { + _timer = Timer(Duration(milliseconds: time), () { + notResponseListener(_responser); + }); + } + + ResponseChecker.seecond(this._responser, int time, void Function(T) notResponseListener) { + ResponseChecker(this._responser, time * 1000, notResponseListener); + } + + T responsed() { + _timer.cancel(); + return _responser; + } +} \ No newline at end of file diff --git a/lib/socket/protobuf_server.dart b/lib/socket/protobuf_server.dart index cbb0f48..220ec5d 100644 --- a/lib/socket/protobuf_server.dart +++ b/lib/socket/protobuf_server.dart @@ -34,15 +34,16 @@ abstract class ProtobufServer void onDisconnectedClient(ProtobufClient client) { + client.removeDisconnectListener(onDisconnectedClient); _clientList.remove(client); client.dispose(); print('Client disconnected'); } - void onTemplateData(TemplateData data) + void onTemplateData(TestData data) { print(data.message); - var template = TemplateData(); + var template = TestData(); template.index = 3125; template.message = 'This message from flutter'; _clientList[0].send(template);