base socket class 추가
This commit is contained in:
parent
75f8db6d64
commit
d0afe28486
3 changed files with 132 additions and 0 deletions
116
lib/socket/socket_client.dart
Normal file
116
lib/socket/socket_client.dart
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
|
||||
class SocketClient {
|
||||
SocketClient(this._ipAddress, this._port);
|
||||
|
||||
static const int headerSize = 10;
|
||||
static const int intSize = 4;
|
||||
late final String _ipAddress;
|
||||
late final int _port;
|
||||
late Socket? _socket;
|
||||
late List<int> _byteList = <int>[];
|
||||
late int _total = -1;
|
||||
|
||||
late Function? eventDisconnected;
|
||||
late Function(String) eventReceiveMessage;
|
||||
|
||||
void connect([void Function(bool result)? resultListener]) {
|
||||
bool connected = false;
|
||||
Socket.connect(_ipAddress, _port).then((socket) {
|
||||
try {
|
||||
_socket = socket;
|
||||
_socket!.listen(_onMessage, onError: _onError, onDone: _onDone);
|
||||
print('[SocketClient] Socket connected to $_ipAddress');
|
||||
connected = true;
|
||||
} catch (e) {
|
||||
print(e);
|
||||
}
|
||||
resultListener??(connected);
|
||||
// ignore: argument_type_not_assignable_to_error_handler
|
||||
}).catchError((AsyncError e) {
|
||||
print('Unable to connect: $e');
|
||||
resultListener??(connected);
|
||||
});
|
||||
}
|
||||
|
||||
//extra: 6bytes의 커스텀 정보, 서버와 프로토콜이 맞춰져있어야함
|
||||
void send(String message, [List<int>? extra]) {
|
||||
final byteMessage = utf8.encode(message);
|
||||
// final byteLength = ByteArray(4);
|
||||
// byteLength.writeInt(byteMessage.length);
|
||||
// final byteArray = byteLength.buffer.asUint8List(0, 4);
|
||||
final byteLength = Uint8List(4);
|
||||
final byteDataLength = byteLength.buffer.asByteData();
|
||||
byteDataLength.setInt32(0, byteMessage.length);
|
||||
final byteArray = byteLength.buffer.asUint8List(0, 4);
|
||||
final byteExtra = extra == null ? [0, 0, 0, 0, 0, 0] : extra;
|
||||
final byteSend = byteArray + byteExtra + byteMessage;
|
||||
_socket!.add(byteSend);
|
||||
}
|
||||
|
||||
void disconnect() {
|
||||
eventDisconnected??();
|
||||
_socket!.close();
|
||||
_socket = null;
|
||||
}
|
||||
|
||||
void _onMessage(data) {
|
||||
final byteData = data as Uint8List;
|
||||
try {
|
||||
final bytesRead = byteData.length;
|
||||
//print('Data Recevied!! $bytesRead');
|
||||
|
||||
if (bytesRead > 0) {
|
||||
_byteList += byteData;
|
||||
}
|
||||
_parsing();
|
||||
} on Exception catch (e) {
|
||||
print(e);
|
||||
print(utf8.decode(byteData));
|
||||
}
|
||||
}
|
||||
|
||||
void _parsing() {
|
||||
if (_total < 0) {
|
||||
if (_byteList.length >= headerSize) {
|
||||
final bytesLength = Uint8List.fromList(
|
||||
_byteList.getRange(0, intSize).toList(growable: false));
|
||||
final bytesExtra = Uint8List.fromList(
|
||||
_byteList.getRange(intSize, headerSize).toList(growable: false));
|
||||
_total = bytesLength.buffer.asByteData().getInt32(0, Endian.big);
|
||||
// _total = ByteArray.fromBuffer(bytesLength.buffer).readInt();
|
||||
print(_total);
|
||||
if (_total == 0) {
|
||||
_total = -1;
|
||||
_byteList.clear();
|
||||
} else {
|
||||
_parsing();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (_byteList.length >= _total + headerSize) {
|
||||
_byteList.removeRange(0, headerSize);
|
||||
final list = Uint8List.fromList(
|
||||
_byteList.getRange(0, _total).toList(growable: false));
|
||||
final message = utf8.decode(list);
|
||||
//print(message);
|
||||
if (eventReceiveMessage != null) eventReceiveMessage(message);
|
||||
_byteList = _byteList.getRange(_total, _byteList.length).toList();
|
||||
_total = -1;
|
||||
_parsing();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _onError(error, StackTrace trace) {
|
||||
print('onError: $error');
|
||||
}
|
||||
|
||||
void _onDone() {
|
||||
print('Disconnected');
|
||||
eventDisconnected??();
|
||||
}
|
||||
}
|
||||
15
lib/socket/web_socket_connector.dart
Normal file
15
lib/socket/web_socket_connector.dart
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
import 'package:web_socket_channel/html.dart';
|
||||
|
||||
class WebSocketConnector {
|
||||
late HtmlWebSocketChannel _socket;
|
||||
|
||||
Future connect() async {
|
||||
_socket =
|
||||
HtmlWebSocketChannel.connect('ws://127.0.0.1:9090/ws/view/');
|
||||
_socket.stream.listen((message) async {
|
||||
print('Received message from server');
|
||||
print(message);
|
||||
_socket.sink.add('this is from flutter');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@ dependencies:
|
|||
color: ^3.0.0
|
||||
protobuf: ^3.1.0
|
||||
encrypt: ^5.0.3
|
||||
web_socket_channel: ^3.0.2
|
||||
# subtitle_wrapper_package: ^2.1.1
|
||||
# equatable: ^2.0.5
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue