Index: samples/chat/chat_server_lib.dart |
diff --git a/samples/chat/chat_server_lib.dart b/samples/chat/chat_server_lib.dart |
index 86f720b11b8185e0953bdbbb314d8d954d0d42e5..f3fa26d63af82028d35b266501e453540fb5fbc6 100644 |
--- a/samples/chat/chat_server_lib.dart |
+++ b/samples/chat/chat_server_lib.dart |
@@ -6,13 +6,20 @@ library chat_server; |
import 'dart:async'; |
import 'dart:io'; |
import 'dart:isolate'; |
-import "dart:convert"; |
+import 'dart:convert'; |
import 'dart:math'; |
-void startChatServer() { |
+Future<SendPort> spawnChatServer() { |
+ var response = new ReceivePort(); |
+ return Isolate.spawn(startChatServer, response.sendPort) |
+ .then((remoteIsolate) => response.first) |
+ .whenComplete(() { response.close(); }); // Make sure the port is closed. |
+} |
+ |
+void startChatServer(SendPort replyTo) { |
var server = new ChatServer(); |
server.init(); |
- port.receive(server.dispatch); |
+ replyTo.send(server.dispatchSendPort); |
} |
class ChatServer extends IsolatedServer { |
@@ -32,19 +39,19 @@ class ServerMain { |
void _start(String hostAddress, int tcpPort) { |
// Handle status messages from the server. |
- _statusPort.receive((var message, SendPort replyTo) { |
+ _statusPort.listen((var message) { |
String status = message.message; |
print("Received status: $status"); |
}); |
// Send server start message to the server. |
var command = new ChatServerCommand.start(hostAddress, tcpPort); |
- _serverPort.send(command, _statusPort.toSendPort()); |
+ _serverPort.send([command, _statusPort.sendPort]); |
} |
void shutdown() { |
// Send server stop message to the server. |
- _serverPort.send(new ChatServerCommand.stop(), _statusPort.toSendPort()); |
+ _serverPort.send([new ChatServerCommand.stop(), _statusPort.sendPort]); |
_statusPort.close(); |
} |
@@ -301,6 +308,10 @@ class IsolatedServer { |
<p>The requested URL was not found on this server.</p> |
</body></html>"""; |
+ IsolatedServer() : _dispatchReceivePort = new ReceivePort() { |
+ _dispatchReceivePort.listen(dispatch); |
+ } |
+ |
void _sendJSONResponse(HttpResponse response, Map responseData) { |
response.headers.set("Content-Type", "application/json; charset=UTF-8"); |
response.write(JSON.encode(responseData)); |
@@ -540,12 +551,16 @@ class IsolatedServer { |
} |
} |
- void dispatch(message, replyTo) { |
- if (message.isStart) { |
- _host = message.host; |
- _port = message.port; |
- _logging = message.logging; |
- replyTo.send(new ChatServerStatus.starting(), null); |
+ SendPort get dispatchSendPort => _dispatchReceivePort.sendPort; |
+ |
+ void dispatch(message) { |
+ var command = message[0]; |
+ var replyTo = message[1]; |
+ if (command.isStart) { |
+ _host = command.host; |
+ _port = command.port; |
+ _logging = command.logging; |
+ replyTo.send(new ChatServerStatus.starting()); |
var handlers = {}; |
void addRequestHandler(String path, Function handler) { |
handlers[path] = handler; |
@@ -574,27 +589,28 @@ class IsolatedServer { |
_notFoundHandler(request, request.response); |
} |
}); |
- replyTo.send(new ChatServerStatus.started(_server.port), null); |
+ replyTo.send(new ChatServerStatus.started(_server.port)); |
_loggingTimer = |
new Timer.periodic(const Duration(seconds: 1), _handleLogging); |
}) |
.catchError((e) { |
- replyTo.send(new ChatServerStatus.error2(e.toString()), null); |
+ replyTo.send(new ChatServerStatus.error2(e.toString())); |
}); |
- } else if (message.isStop) { |
- replyTo.send(new ChatServerStatus.stopping(), null); |
+ } else if (command.isStop) { |
+ replyTo.send(new ChatServerStatus.stopping()); |
stop(); |
- replyTo.send(new ChatServerStatus.stopped(), null); |
+ replyTo.send(new ChatServerStatus.stopped()); |
} |
} |
stop() { |
_server.close(); |
_cleanupTimer.cancel(); |
- port.close(); |
+ _dispatchReceivePort.close(); |
} |
String _host; |
+ ReceivePort _dispatchReceivePort; |
int _port; |
HttpServer _server; // HTTP server instance. |
bool _logRequests; |