У меня есть сокет сервера, и когда я обращаюсь к нему с помощью Java, устанавливаю socket.setSoLinger (true, 0);это работает очень хорошо.Я пытаюсь реализовать клиентский код Java с помощью dart и постоянно получаю сообщение об ошибке.Также требуется время, чтобы получить ошибку.Дротик, предположим, будет быстрым!
В Java я открываю сокет как socketOut = new DataOutPutStream (socket.getOutputStream ());и socketIn = new DataInputStream (socket.getInputStream ());
и чем я могу использовать socketOut.write (queryStr.getBytes ()); для записи и я могу использовать response + = socketIn.readLine (); для чтения.
Для моего демонстрационного проекта Dart я написал следующий код и продолжаю получать ошибку ниже.
Ошибка:
Unhandled exception:
SocketException: OS Error: Broken pipe, errno = 32, address = ***.***.***.***, port = 48620
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#3 _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)
Код дротика:
import 'package:untitled/untitled.dart' as untitled;
import 'dart:io';
import 'dart:async';
Socket socket;
String _dataToBeSent = "00802020N0307809491508590203000000000000490012001629 01700CD0";
var reply;
// TODO: MAIN
main(List<String> arguments) {
_remoteServerConnect();
}
// TODO: REMOTE SERVER CONNECT
void _remoteServerConnect() async {
try {
var socket = await Socket.connect('***.***.***.***', *****);
socket.writeln('$_dataToBeSent\n');
await for (var data in socket) {
reply = new String.fromCharCodes(data).trim();
print("reply: $reply");
socket.close();
socket.destroy();
} // await socket
socket.handleError((data) {
print("error: $data");
});
} on Error catch (e) {
print(e.toString());
} on Exception catch (f) {
print(f.toString());
}
}
Я не уверен.Но что-то подсказывает мне, что мне нужно использовать RawSocket.И мой вопрос: как использовать RawSocket In Dart?
UPDATE-1: После прочтения ссылки мне удается перекодировать сокет, как показано ниже.Но на этот раз я получаю ошибку socket.write.
// TODO: REMOTE SERVER CONNECT
void _remoteServerConnect() {
Socket.connect('***.***.***.***', *****).then((Socket sock) {
socket = sock;
socket.listen(dataHandler,
onError: errorHandler,
onDone: doneHandler,
cancelOnError: false);
}).catchError((AsyncError e) {
print("Unable to connect: $e");
exit(1);
});
print(_dataToBeSent);
socket.write(_dataToBeSent);
}
void dataHandler(data){
print(new String.fromCharCodes(data).trim());
}
void errorHandler(error, StackTrace trace){
print(error);
}
void doneHandler(){
socket.destroy();
exit(0);
}
Я получил ошибку в "socket.write (_dataToBeSent);"строка, говорящая, что метод 'write' был вызван в null.
00802020N0307809491508590203000000000000490012001629 01700CD0
Unhandled exception:
NoSuchMethodError: The method 'write' was called on null.
Receiver: null
Tried calling: write(""00802020N0307809491508590203000000000000490012001629 01700CD0"")
#0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:48:5)
#1 _remoteServerConnect (file:///home/capital/IdeaProjects/untitled/bin/main.dart:31:10)
#2 main (file:///home/capital/IdeaProjects/untitled/bin/main.dart:13:3)
#3 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:287:32)
#4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
UPDATE-2: Если я использую Future, я не вижу никаких данных, но он работает без ошибок.
// TODO: ДИСТАНЦИОННОЕ СЕРВЕРНОЕ СОЕДИНЕНИЕ
Future _remoteServerConnect() async {
await Socket.connect('***.***.***.***', ******).then((Socket sock) {
socket = sock;
socket.listen(dataHandler,
onError: errorHandler,
onDone: doneHandler,
cancelOnError: false);
}).catchError((AsyncError e) {
print("Unable to connect: $e");
exit(1);
});
print(_dataToBeSent);
await socket.write(_dataToBeSent);
}
void dataHandler(data){
print(new String.fromCharCodes(data).trim());
}
void errorHandler(error, StackTrace trace){
print(error);
}
void doneHandler(){
socket.destroy();
exit(0);
}
Результат:
00802020N02018092108262302030000000000005494490012001629 00000000
Process finished with exit code 0