当前位置: 首页 > 知识库问答 >
问题:

如何在Dart中使用RawSocket?

狄雅珺
2023-03-14

我有服务器套接字,当我用java访问它时,设置socket.setsolinger(true,0);is工作得很好。我试图用dart实现java客户机代码,但我一直得到一个错误。此外,获取错误也需要时间。飞镖应该是快的!

在java中,我将套接字打开为socketOut=new DataOutPutStream(socket.getOutputStream());和socketIn=new DataInputStream(socket.getInputStream());

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());
  }
}
// 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);
}
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)

//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

共有1个答案

孔冥夜
2023-03-14

不确定它是否仍然相关,但代码中存在潜在错误。您不应该尝试在connect的回调中设置socket=sock,而应该将其设置为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);
}
 类似资料:
  • 我正在考虑在我的一个项目中使用dart-protobuf来代替JSON。问题是这个库没有提供任何如何使用它的例子,测试也没有真正的帮助。 我对解析文件的工作方式也有点困惑。 所以我想找一个简单的例子来说明如何在dart中使用这个库。

  • 我是Dart和Flutter的新手。当我学习教程时,我了解到我们可以使用工厂关键字制作单例。但在那之后,我得到了这个代码。 我的问题。 代码是如何工作的 何时调用<code>getInstance() 是是构造函数吗

  • Dart 2.6引入了一个新的语言特性,叫做“静态扩展成员”。 但是,我不太明白如何使用它。 我希望轻松获取或的,即使用而不是: 我试图执行以下操作,但这是一个语法错误:

  • 单例模式确保只创建一个类的实例。我如何在飞镖中建立这个?

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的

  • Dart语言没有枚举(还没有??).至少在语言特性出现之前,构造枚举的正确或惯用方法是什么?