하트비트 추가

This commit is contained in:
build@lguplus.co.kr 2023-12-16 00:30:06 +09:00
parent d2f5f854ee
commit a0d8e93d6c
6 changed files with 88 additions and 67 deletions

View file

@ -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<HeartBeat> {
}
public sealed partial class TemplateData : pb::IMessage<TemplateData> {
private static readonly pb::MessageParser<TemplateData> _parser = new pb::MessageParser<TemplateData>(() => new TemplateData());
public sealed partial class TestData : pb::IMessage<TestData> {
private static readonly pb::MessageParser<TestData> _parser = new pb::MessageParser<TestData>(() => new TestData());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pb::MessageParser<TemplateData> Parser { get { return _parser; } }
public static pb::MessageParser<TestData> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public static pbr::MessageDescriptor Descriptor {
@ -341,22 +341,22 @@ public sealed partial class TemplateData : pb::IMessage<TemplateData> {
}
[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);
}
/// <summary>Field number for the "index" field.</summary>
@ -383,11 +383,11 @@ public sealed partial class TemplateData : pb::IMessage<TemplateData> {
[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<TemplateData> {
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public void MergeFrom(TemplateData other) {
public void MergeFrom(TestData other) {
if (other == null) {
return;
}

View file

@ -8,7 +8,7 @@ message PacketBase {
message HeartBeat {}
message TemplateData {
message TestData {
int32 index = 1;
string message = 2;
}

View file

@ -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<TemplateData> createRepeated() => $pb.PbList<TemplateData>();
static TestData create() => TestData._();
TestData createEmptyInstance() => create();
static $pb.PbList<TestData> createRepeated() => $pb.PbList<TestData>();
@$core.pragma('dart2js:noInline')
static TemplateData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TemplateData>(create);
static TemplateData? _defaultInstance;
static TestData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TestData>(create);
static TestData? _defaultInstance;
@$pb.TagNumber(1)
$core.int get index => $_getIZ(0);

View file

@ -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==');

View file

@ -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<int> _arrivedData = [];
List<void Function(ProtobufClient)> _onDisconnectListenerList = [];
ProtobufClient(this._socket, this._heartbeatTime, Map<String, GeneratedMessage Function(List<int>)> parserMap)
{
ProtobufClient(this._socket, this._heartbeatIntervalTime, this._heartbeatWaitTime, Map<String, GeneratedMessage Function(List<int>)> 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<int> packet)
{
void printPacket(String prefix, List<int> 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<T> {
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;
}
}

View file

@ -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);