From 23a06336238c95e5bbaf59b6b35129df6a2aa890 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sat, 22 Oct 2022 21:26:38 +0800 Subject: [PATCH] Improvements & Feature: - Add API ACKFETCH to update fetch history - Improve anti-exception performance --- bin/tcp_server.dart | 134 ++++++++++++++++++++++++++---- lib/database.dart | 28 +++---- lib/requesthandler.dart | 10 ++- lib/tcpcontroller/controller.dart | 21 ++--- lib/tcpcontroller/request.dart | 4 +- 5 files changed, 154 insertions(+), 43 deletions(-) diff --git a/bin/tcp_server.dart b/bin/tcp_server.dart index cf7d126..e5ff80b 100644 --- a/bin/tcp_server.dart +++ b/bin/tcp_server.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-06 15:44:16 - * @LastEditTime : 2022-10-22 20:35:50 + * @LastEditTime : 2022-10-22 21:25:00 * @Description : */ @@ -38,7 +38,7 @@ void main(List arguments) async { onError: (_) { print('[L] [EXCEPTION]-----------------------'); print('[L] TCP Controller ran into exception'); - print('[L] Remote: ${controller.socket.remoteAddress}:${controller.socket.remotePort}'); + print('[L] socket: ${controller.socket.address}:${controller.socket.port}'); var token = controllerMap[controller]; controllerMap.remove(controller); tokenMap[token]?.remove(controller); @@ -81,17 +81,38 @@ void main(List arguments) async { switch(request.requestType) { case RequestType.checkState: { var response = await onCheckState(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.register: { var response = await onRegister(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.login: { var response = await onLogin(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.logout: { @@ -101,17 +122,38 @@ void main(List arguments) async { } case RequestType.profile: { var response = await onFetchProfile(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.modifyProfile: { var response = await onModifyProfile(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.modifyPassword: { var response = await onModifyPassword(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.sendMessage: { @@ -183,32 +225,74 @@ void main(List arguments) async { // ); } var response = await onSendMessage(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.fetchMessage: { var response = await onFetchMessage(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.findFile: { var response = await onFindFile(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.fetchFile: { var response = await onFetchFile(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.searchUser: { var response = await onSearchUser(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } case RequestType.addContact: { var response = await onAddContact(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } var contactResponse = await onFetchContact( TCPRequest.fromData( type: RequestType.fetchContact, @@ -222,12 +306,30 @@ void main(List arguments) async { } case RequestType.fetchContact: { var response = await onFetchContact(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } + break; + } + case RequestType.ackFetch: { + onAckFetch(request, socket); break; } case RequestType.unknown: { var response = await onUnknownRequest(request, socket); - controller.outStream.add(response); + try { + controller.outStream.add(response); + } catch (e) { + print('[E] [EXCEPTION]-----------------------'); + var token = controllerMap[controller]; + controllerMap.remove(controller); + tokenMap[token]?.remove(controller); + } break; } default: { diff --git a/lib/database.dart b/lib/database.dart index 2e5c7c7..ea965b2 100644 --- a/lib/database.dart +++ b/lib/database.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-06 16:15:01 - * @LastEditTime : 2022-10-20 20:58:57 + * @LastEditTime : 2022-10-22 21:08:27 * @Description : */ @@ -403,19 +403,19 @@ class DataBaseHelper { }).toList(); //Set new fetch history - if(unfetchMsgQueryResult.isNotEmpty) { - await _database.update( - 'histories', - { - 'lastfetch': unfetchMsgQueryResult[0]['timestamp'] - }, - where: 'tokenid = ? and userid = ?', - whereArgs: [ - tokenID, - userID - ] - ); - } + // if(unfetchMsgQueryResult.isNotEmpty) { + // await _database.update( + // 'histories', + // { + // 'lastfetch': unfetchMsgQueryResult[0]['timestamp'] + // }, + // where: 'tokenid = ? and userid = ?', + // whereArgs: [ + // tokenID, + // userID + // ] + // ); + // } //return result return unfetchMessages; diff --git a/lib/requesthandler.dart b/lib/requesthandler.dart index 5532bc1..9d5272e 100644 --- a/lib/requesthandler.dart +++ b/lib/requesthandler.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-08 20:52:48 - * @LastEditTime : 2022-10-15 00:40:24 + * @LastEditTime : 2022-10-22 20:56:15 * @Description : */ @@ -276,6 +276,14 @@ Future onFetchContact(TCPRequest request, Socket socket) async { } } +void onAckFetch(TCPRequest request, Socket socket) async { + //Update Fetch Histories + await DataBaseHelper().setFetchHistoryFor( + tokenID: request.tokenID, + newTimeStamp: request.body['timestamp'] as int, + ); +} + Future onUnknownRequest(TCPRequest request, Socket socket) async { return TCPResponse( type: ResponseType.fromRequestType(request.requestType), diff --git a/lib/tcpcontroller/controller.dart b/lib/tcpcontroller/controller.dart index 4018458..432d7f6 100644 --- a/lib/tcpcontroller/controller.dart +++ b/lib/tcpcontroller/controller.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-08 15:10:04 - * @LastEditTime : 2022-10-22 20:30:36 + * @LastEditTime : 2022-10-22 21:20:57 * @Description : */ @@ -58,20 +58,21 @@ class TCPController { print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}'); print('[L] Local: ${socket.address}:${socket.port}'); Future(() async { - await for(var request in socket) { - _pullRequest(request); - await Future.delayed(const Duration(microseconds: 0)); + try { + await for(var request in socket) { + _pullRequest(request); + await Future.delayed(const Duration(microseconds: 0)); + } + } catch (e) { + _requestStreamController.addError(e); + _responseStreamController.addError(e); } }).then((_) { print('[L] [CLOSED ]-----------------------'); - print('[L] Connection closed: ${socket.address}:${socket.port}<-${socket.remoteAddress}:${socket.remotePort}'); + print('[L] Connection closed: ${socket.address}:${socket.port}'); _requestStreamController.close(); _responseStreamController.close(); - }).onError((error, stackTrace) { - print(error); - _requestStreamController.addError(error ?? Error()); - _responseStreamController.addError(error ?? Error()); - },); + }); // socket.listen( // _pullRequest, // onError: (e) { diff --git a/lib/tcpcontroller/request.dart b/lib/tcpcontroller/request.dart index d6f0270..2287e2d 100644 --- a/lib/tcpcontroller/request.dart +++ b/lib/tcpcontroller/request.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-08 15:14:26 - * @LastEditTime : 2022-10-22 20:21:10 + * @LastEditTime : 2022-10-22 20:54:40 * @Description : */ import 'dart:convert'; @@ -16,7 +16,7 @@ enum RequestType { modifyPassword('MODIFYPASSWD'), //Modify user password modifyProfile ('MODIFYPROFILE'), //Modify user profile sendMessage ('SENDMSG'), //Send message - ackMessage ('ACKMSG'), //Ack forwarded messages, update fetch history + ackFetch ('ACKFETCH'), //Ack fetched messages, update fetch history fetchMessage ('FETCHMSG'), //Fetch message findFile ('FINDFILE'), //Find file by md5 before transmitting the file fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5