mirror of
https://github.com/Linloir/Simple-TCP-Server.git
synced 2025-12-16 23:48:11 +08:00
Improvements & Feature:
- Add API ACKFETCH to update fetch history - Improve anti-exception performance
This commit is contained in:
parent
3e575110a9
commit
23a0633623
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author : Linloir
|
* @Author : Linloir
|
||||||
* @Date : 2022-10-06 15:44:16
|
* @Date : 2022-10-06 15:44:16
|
||||||
* @LastEditTime : 2022-10-22 20:35:50
|
* @LastEditTime : 2022-10-22 21:25:00
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ void main(List<String> arguments) async {
|
|||||||
onError: (_) {
|
onError: (_) {
|
||||||
print('[L] [EXCEPTION]-----------------------');
|
print('[L] [EXCEPTION]-----------------------');
|
||||||
print('[L] TCP Controller ran into 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];
|
var token = controllerMap[controller];
|
||||||
controllerMap.remove(controller);
|
controllerMap.remove(controller);
|
||||||
tokenMap[token]?.remove(controller);
|
tokenMap[token]?.remove(controller);
|
||||||
@ -81,17 +81,38 @@ void main(List<String> arguments) async {
|
|||||||
switch(request.requestType) {
|
switch(request.requestType) {
|
||||||
case RequestType.checkState: {
|
case RequestType.checkState: {
|
||||||
var response = await onCheckState(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.register: {
|
case RequestType.register: {
|
||||||
var response = await onRegister(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.login: {
|
case RequestType.login: {
|
||||||
var response = await onLogin(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.logout: {
|
case RequestType.logout: {
|
||||||
@ -101,17 +122,38 @@ void main(List<String> arguments) async {
|
|||||||
}
|
}
|
||||||
case RequestType.profile: {
|
case RequestType.profile: {
|
||||||
var response = await onFetchProfile(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.modifyProfile: {
|
case RequestType.modifyProfile: {
|
||||||
var response = await onModifyProfile(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.modifyPassword: {
|
case RequestType.modifyPassword: {
|
||||||
var response = await onModifyPassword(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.sendMessage: {
|
case RequestType.sendMessage: {
|
||||||
@ -183,32 +225,74 @@ void main(List<String> arguments) async {
|
|||||||
// );
|
// );
|
||||||
}
|
}
|
||||||
var response = await onSendMessage(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.fetchMessage: {
|
case RequestType.fetchMessage: {
|
||||||
var response = await onFetchMessage(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.findFile: {
|
case RequestType.findFile: {
|
||||||
var response = await onFindFile(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.fetchFile: {
|
case RequestType.fetchFile: {
|
||||||
var response = await onFetchFile(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.searchUser: {
|
case RequestType.searchUser: {
|
||||||
var response = await onSearchUser(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.addContact: {
|
case RequestType.addContact: {
|
||||||
var response = await onAddContact(request, socket);
|
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(
|
var contactResponse = await onFetchContact(
|
||||||
TCPRequest.fromData(
|
TCPRequest.fromData(
|
||||||
type: RequestType.fetchContact,
|
type: RequestType.fetchContact,
|
||||||
@ -222,12 +306,30 @@ void main(List<String> arguments) async {
|
|||||||
}
|
}
|
||||||
case RequestType.fetchContact: {
|
case RequestType.fetchContact: {
|
||||||
var response = await onFetchContact(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case RequestType.unknown: {
|
case RequestType.unknown: {
|
||||||
var response = await onUnknownRequest(request, socket);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author : Linloir
|
* @Author : Linloir
|
||||||
* @Date : 2022-10-06 16:15:01
|
* @Date : 2022-10-06 16:15:01
|
||||||
* @LastEditTime : 2022-10-20 20:58:57
|
* @LastEditTime : 2022-10-22 21:08:27
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -403,19 +403,19 @@ class DataBaseHelper {
|
|||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
//Set new fetch history
|
//Set new fetch history
|
||||||
if(unfetchMsgQueryResult.isNotEmpty) {
|
// if(unfetchMsgQueryResult.isNotEmpty) {
|
||||||
await _database.update(
|
// await _database.update(
|
||||||
'histories',
|
// 'histories',
|
||||||
{
|
// {
|
||||||
'lastfetch': unfetchMsgQueryResult[0]['timestamp']
|
// 'lastfetch': unfetchMsgQueryResult[0]['timestamp']
|
||||||
},
|
// },
|
||||||
where: 'tokenid = ? and userid = ?',
|
// where: 'tokenid = ? and userid = ?',
|
||||||
whereArgs: [
|
// whereArgs: [
|
||||||
tokenID,
|
// tokenID,
|
||||||
userID
|
// userID
|
||||||
]
|
// ]
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
//return result
|
//return result
|
||||||
return unfetchMessages;
|
return unfetchMessages;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author : Linloir
|
* @Author : Linloir
|
||||||
* @Date : 2022-10-08 20:52:48
|
* @Date : 2022-10-08 20:52:48
|
||||||
* @LastEditTime : 2022-10-15 00:40:24
|
* @LastEditTime : 2022-10-22 20:56:15
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -276,6 +276,14 @@ Future<TCPResponse> 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<TCPResponse> onUnknownRequest(TCPRequest request, Socket socket) async {
|
Future<TCPResponse> onUnknownRequest(TCPRequest request, Socket socket) async {
|
||||||
return TCPResponse(
|
return TCPResponse(
|
||||||
type: ResponseType.fromRequestType(request.requestType),
|
type: ResponseType.fromRequestType(request.requestType),
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author : Linloir
|
* @Author : Linloir
|
||||||
* @Date : 2022-10-08 15:10:04
|
* @Date : 2022-10-08 15:10:04
|
||||||
* @LastEditTime : 2022-10-22 20:30:36
|
* @LastEditTime : 2022-10-22 21:20:57
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -58,20 +58,21 @@ class TCPController {
|
|||||||
print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}');
|
print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}');
|
||||||
print('[L] Local: ${socket.address}:${socket.port}');
|
print('[L] Local: ${socket.address}:${socket.port}');
|
||||||
Future(() async {
|
Future(() async {
|
||||||
await for(var request in socket) {
|
try {
|
||||||
_pullRequest(request);
|
await for(var request in socket) {
|
||||||
await Future.delayed(const Duration(microseconds: 0));
|
_pullRequest(request);
|
||||||
|
await Future.delayed(const Duration(microseconds: 0));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
_requestStreamController.addError(e);
|
||||||
|
_responseStreamController.addError(e);
|
||||||
}
|
}
|
||||||
}).then((_) {
|
}).then((_) {
|
||||||
print('[L] [CLOSED ]-----------------------');
|
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();
|
_requestStreamController.close();
|
||||||
_responseStreamController.close();
|
_responseStreamController.close();
|
||||||
}).onError((error, stackTrace) {
|
});
|
||||||
print(error);
|
|
||||||
_requestStreamController.addError(error ?? Error());
|
|
||||||
_responseStreamController.addError(error ?? Error());
|
|
||||||
},);
|
|
||||||
// socket.listen(
|
// socket.listen(
|
||||||
// _pullRequest,
|
// _pullRequest,
|
||||||
// onError: (e) {
|
// onError: (e) {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author : Linloir
|
* @Author : Linloir
|
||||||
* @Date : 2022-10-08 15:14:26
|
* @Date : 2022-10-08 15:14:26
|
||||||
* @LastEditTime : 2022-10-22 20:21:10
|
* @LastEditTime : 2022-10-22 20:54:40
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
@ -16,7 +16,7 @@ enum RequestType {
|
|||||||
modifyPassword('MODIFYPASSWD'), //Modify user password
|
modifyPassword('MODIFYPASSWD'), //Modify user password
|
||||||
modifyProfile ('MODIFYPROFILE'), //Modify user profile
|
modifyProfile ('MODIFYPROFILE'), //Modify user profile
|
||||||
sendMessage ('SENDMSG'), //Send message
|
sendMessage ('SENDMSG'), //Send message
|
||||||
ackMessage ('ACKMSG'), //Ack forwarded messages, update fetch history
|
ackFetch ('ACKFETCH'), //Ack fetched messages, update fetch history
|
||||||
fetchMessage ('FETCHMSG'), //Fetch message
|
fetchMessage ('FETCHMSG'), //Fetch message
|
||||||
findFile ('FINDFILE'), //Find file by md5 before transmitting the file
|
findFile ('FINDFILE'), //Find file by md5 before transmitting the file
|
||||||
fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5
|
fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user