-
Notifications
You must be signed in to change notification settings - Fork 0
/
ClientHandler.cs
57 lines (48 loc) · 1.92 KB
/
ClientHandler.cs
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
using System;
using ConcurrencyUtilities;
using System.Net.Sockets;
namespace ZorkServer
{
// Input channel: messages to send to the client through the network stream
// Output channel: commands from the client to send to the command parser
// Can't use a more specific active object class, as it is not functioning in the standard manner of waiting for
// input on a channel as the prompt to start processing.
public class ClientHandler: ActiveObject
{
NetworkStream _networkStream;
Channel<string> _command;
Channel<string> _commandResultMessage;
public ClientHandler(NetworkStream networkStream, Channel<string> command,
Channel<string> commandResultMessage): base() {
_networkStream = networkStream;
_command = command;
_commandResultMessage = commandResultMessage;
SendStringToClient("Welcome to the Zork server\n");
}
string ReadStringFromClientWithPrompt() {
SendStringToClient("> ");
return ReadStringFromClient();
}
string ReadStringFromClient() {
byte[] bytesRead = new byte[100];
int numBytesRead = _networkStream.Read(bytesRead, 0, 100);
string stringRead = System.Text.ASCIIEncoding.ASCII.GetString(bytesRead, 0, numBytesRead);
return stringRead.TrimEnd('\r', '\n');
}
void SendStringToClient(string sendString) {
byte[] toSend = System.Text.ASCIIEncoding.ASCII.GetBytes(sendString);
_networkStream.Write(toSend, 0, toSend.Length);
}
protected override void Execute() { // Loops continuously
// 1. Wait for a command from the client
string commandRead = ReadStringFromClientWithPrompt();
Console.WriteLine("New command from client: " + '"' + commandRead + '"');
// 2. Send the command to the command parser
_command.Put(commandRead);
// 3. Wait for a result message from the command execution
string resultMessage = _commandResultMessage.Take();
// 4. Send the result message to the client
SendStringToClient(resultMessage);
}
}
}