在鏢

2017-07-07 82 views
2

我試圖通過插座來控制鏢腳本,中隔離 運行運行的SocketServer作爲隔離,我想出了一些(擾流警告)不工作代碼:在鏢

import "dart:io"; 
import "dart:convert"; 
import "dart:isolate"; 

reader(SendPort sendPort) async { 
    var serverSocket = await ServerSocket.bind("127.0.0.1", 83); 
    print('connected'); 
    await for (var socket in serverSocket) { 
    socket.transform(UTF8.decoder).listen((msg) => sendPort.send(msg)); 
    } 
} 

main() { 
    bool start = false; 
    bool stop = false; 
    listener (message) 
    { 
    print ("message from isolate: $message"); 
    stop = start; 
    start = true; 
    } 
    ReceivePort receive = new ReceivePort(); 
    receive.listen(listener); 
Isolate.spawn(reader, receive.sendPort).then((Isolate) => print("Isolate started")); 
    print("Waiting to start"); 
    while (!start) {} 
    print("Waiting to stop"); 
    while (!stop) {} 
    print("Ended"); 
} 

但隔離甚至似乎並不被啓動。腳本只輸出「等待開始」

+0

忙等待像'而(停止!){}'不工作的情況下驅動的系統。 'Isolate.spawn()' –

+0

好吧,我現在就看到它,我用Future重寫了它,沒關係 –

回答

2

這爲我工作:

import 'dart:async'; 
import "dart:io"; 
import "dart:convert"; 
import "dart:isolate"; 

reader(SendPort sendPort) async { 
    print('isolate started'); 
    var serverSocket = await ServerSocket.bind("127.0.0.1", 8123); 
    sendPort.send('bound'); 
    await for (var socket in serverSocket) { 
    socket.transform(UTF8.decoder).listen((msg) { 
     print('server received $msg'); 
     sendPort.send(msg); 
     if (msg == 'close') { 
     socket.close(); 
     serverSocket.close(); 
     } 
    }); 
    } 
} 

StreamSubscription subscription; 
Isolate isolate; 
ReceivePort receive; 

main() async { 
    listener(message) async { 
    print("message from isolate: $message"); 
    if (message == 'bound') { 
     final socket = await Socket.connect("127.0.0.1", 8123); 
     print('client connected'); 
     socket.add('close'.codeUnits); 
     socket.destroy(); 
    } 
    if (message == 'close') { 
     subscription.cancel(); 
     // exits application 
    } 
    } 

    receive = new ReceivePort(); 
    subscription = receive.listen(listener); 
    isolate = await Isolate.spawn(reader, receive.sendPort); 
}