Как вернуть Response.ok с данными сокета? - PullRequest
0 голосов
/ 02 июля 2018

Я могу подключить свой акведук к закрытой сетевой розетке (прослушиватель и получить данные). Проблема в том, что я не могу вернуть новый Response.ok. Это показывает нуль ...

Я использую Акведук 3.0. Большая часть документации выглядит как фрагменты. У меня были трудности с применением дротика. Но теперь я могу получить текст из сокета и не могу отправить данные через Интернет с моего веб-интерфейса акведука.

class LoginController extends Controller {
String _xCustomerToken;
String _xCustomerName;
var list = [];

@override
Future handle(Request request) async {
String reply;
Socket.connect('192.168.1.22’, 1024).then((socket) async {
socket.listen((data) async {
reply = await new String.fromCharCodes(data).trim();
print("reply: $reply");

    var list = reply.split(":_:");
    print(list);
    _xCustomerToken = list[2];
    _xCustomerName = list[3];

    // CAN PRINT THE SOCKET DATA
    // EXAMPLE: ”Customer Token: 998877, CustomerName: NIYAZI TOROS”
    print(
        "Customer Token: $_xCustomerToken, CustomerName: $_xCustomerName");

    await new Future.delayed(new Duration(seconds: 2));
  }, onDone: () {
    print("Done");
  });
  socket.write('Q101:_:49785:_:x\r\n');
});

// CANT RETURN THE SOCKET DATA
return new Response.ok(
 // EXAMPLE: "Customer Token: null, CustomerName: null”
    "Customer Token: $_xCustomerToken, CustomerName: $_xCustomerName");
}
}

Обновление: Я помещаю инструкцию return в ожидании (слушаю), и теперь я набираю http://192.168.1.22:8888/login Я правильно получаю информацию.

class LoginController extends Controller {
  String _xCustomerToken;
  String _xCustomerName;
  String _xResult;
  var list = [];

  @override
  Future<RequestOrResponse> handle(Request request) async {
    String reply;

    var socket = await Socket.connect('192.168.1.22', 1024);
    socket.write('Q101:_:49785:_:x\r\n');

    await for (var data in socket) {
      reply = await new String.fromCharCodes(data).trim();
      var list = reply.split(":_:");
      _xCustomerToken = list[2];
      _xCustomerName = list[3];
      _xResult = "$_xCustomerToken:_:$_xCustomerName";
      print("$_xResult");
      return new Response.ok("$_xResult");
    }
    return new Response.ok("No data");
  }
}

1 Ответ

0 голосов
/ 02 июля 2018

.listen() не будет ждать завершения для выполнения остальной части кода, тогда вы нажимаете return new Response.ok("Customer Token: $_xCustomerToken, CustomerName: $_xCustomerName"); справа внизу с нулевыми значениями. Вместо этого вы можете попробовать использовать await:

class LoginController extends Controller {
    String _xCustomerToken;
    String _xCustomerName;
    var list = [];

    @override
    Future handle(Request request) async {
        String reply;

        var socket = await Socket.connect('192.168.1.22’, 1024);
        socket.write('Q101:_:49785:_:x\r\n');

        await for (var data in socket) {
            reply = await new String.fromCharCodes(data).trim();
            print("reply: $reply");

            var list = reply.split(":_:");
            print(list);

            _xCustomerToken = list[2];
            _xCustomerName = list[3];

            // CAN PRINT THE SOCKET DATA
            // EXAMPLE: ”Customer Token: 998877, CustomerName: NIYAZI TOROS”
            print("Customer Token: $_xCustomerToken, CustomerName: $_xCustomerName");

            await new Future.delayed(new Duration(seconds: 2));
        }

        return new Response.ok("Customer Token: $_xCustomerToken, CustomerName: $_xCustomerName");
    }
}
...