1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
use core:io;
use util:serialize;
class Request : serializable {
Response execute(Server server) : abstract;
}
class Response : serializable {}
class AddRequest : extends Request, serializable {
Str toAdd;
init(Str toAdd) {
init { toAdd = toAdd; }
}
Response execute(Server server) : override {
server.data.push(toAdd);
return Response();
}
}
class GetRequest : extends Request, serializable {
Response execute(Server server) : override {
return GetResponse(server.data);
}
}
class GetResponse : extends Response, serializable {
Str[] data;
init(Str[] data) {
init { data = data; }
}
}
class Server {
Str[] data;
void run(IStream read, OStream write) {
ObjIStream input(read);
ObjOStream output(BufferedOStream(write));
try {
do {
Request request = Request:read(input);
Response response = request.execute(this);
response.write(output);
output.flush();
}
} catch (EndOfStream e) {
// End of stream reached, this is normal.
} catch (SerializationError e) {
print("Serialization error: ${e.message}");
}
input.close();
output.close();
}
}
class Client {
private ObjIStream input;
private ObjOStream output;
init(IStream read, OStream write) {
init {
input(read);
output(BufferedOStream(write));
}
}
Response request(Request request) {
request.write(output);
output.flush();
return Response:read(input);
}
void close() {
input.close();
output.close();
}
}
void runClient(IStream read, OStream write) {
Client client(read, write);
client.request(AddRequest("a"));
client.request(AddRequest("b"));
if (response = client.request(GetRequest()) as GetResponse) {
print("Final data: ${response.data}");
} else {
print("Invalid response.");
}
client.close();
}
void protocol() {
Pipe a;
Pipe b;
var server = {
Server server;
spawn server.run(a.input, b.output);
};
var client = {
spawn runClient(b.input, a.output);
};
// Wait for both to finish.
server.result();
client.result();
}
|