java - 如何在 Dart 中使用 RawSocket?
问题描述
我有服务器套接字,当我使用 java 设置 socket.setSoLinger(true,0); 访问它时 效果很好。我正在尝试使用 dart 实现 java 客户端代码,但我不断收到错误消息。也需要时间才能得到错误。飞镖应该很快!
在 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。我的问题是如何在 Dart 中使用 RawSocket?
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);”中遇到错误 一行说在 null 上调用了“write”方法。
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
解决方案
不确定它是否仍然相关,但代码中存在潜在错误。与其尝试socket = sock
在回调中进行connect
设置,不如将其设置为由 connect 方法返回的等待值。
Future _remoteServerConnect() async {
socket = await Socket.connect('***.***.***.***', ******).then((Socket sock) {
sock.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);
}
推荐阅读
- powershell - 启动过程:位置参数和找不到指定的文件
- python - Python:将图像从 RGB 转换为 YDbDr 颜色空间
- typescript - 使用 TypeScript 使函数的返回类型取决于其参数?
- reactjs - 带有 react-stripe-elements 的打字稿不通过注入的道具
- laravel - 使用 Laravel Horizon 编排多台服务器中的队列
- javascript - 未捕获的类型错误:无法设置未定义的属性“fontFamily”
- android - Android/Kotlin:意图始终为 NULL
- xml - 如何处理所有只有文本而没有子节点的节点?
- html - 如何在以下演示的右侧添加图像?
- c - c编程 - 从文件中提取数据字符串