Implementation umgebaut, sodass sie besser der Aufgabenstellung entspricht

This commit is contained in:
2014-03-26 14:01:36 +01:00
parent 978f074617
commit ab2da9336f
4 changed files with 79 additions and 49 deletions

View File

@@ -3,15 +3,49 @@ using System.Threading;
public class Program public class Program
{ {
private Terminal Term;
private Receiver Rec;
private Sender Send;
private Thread SenderThread;
private Thread ReceiverThread;
public static void Main () public static void Main ()
{ {
Terminal terminal = new Terminal (); Program program = new Program();
program.startThreads();
}
public Program ()
{
Term = new Terminal ();
TcpClient client = new TcpClient ("localhost", 9999); TcpClient client = new TcpClient ("localhost", 9999);
Receiver receiver = new Receiver (client.GetStream (), terminal); Rec = new Receiver (client);
Sender sender = new Sender (client.GetStream (), terminal); Send = new Sender (client);
Thread receiverThread = new Thread (new ThreadStart (receiver.Receive)); }
receiverThread.Start ();
sender.Send (); public void startThreads ()
client.Close (); {
ReceiverThread = new Thread(new ThreadStart(this.doReceive));
ReceiverThread.Start ();
SenderThread = new Thread(new ThreadStart(this.doSend));
SenderThread.Start();
}
public void doReceive ()
{
string line;
while ((line = Rec.Receive()) != null)
{
Term.PrintLine(line);
}
SenderThread.Abort();
}
public void doSend ()
{
while (true) {
Send.Send(Term.ReadLine());
} }
} }
}

View File

@@ -4,21 +4,18 @@ using System.Net.Sockets;
class Receiver class Receiver
{ {
private TcpClient Client;
private StreamReader Reader; private StreamReader Reader;
private Terminal Term;
public Receiver (NetworkStream stream, Terminal terminal) public Receiver (TcpClient client)
{ {
this.Reader = new StreamReader(stream); this.Client = client;
this.Term = terminal; this.Reader = new StreamReader(Client.GetStream());
} }
public void Receive () public string Receive ()
{ {
while (true) { return Reader.ReadLine();
String line = Reader.ReadLine();
Term.PrintLine(line);
}
} }
} }

View File

@@ -5,21 +5,17 @@ using System.Text;
public class Sender public class Sender
{ {
private StreamWriter Writer; private TcpClient Client;
private Terminal Term;
public Sender (NetworkStream stream, Terminal terminal) public Sender (TcpClient client)
{ {
this.Term = terminal; this.Client = client;
this.Writer = new StreamWriter(stream);
} }
public void Send () public void Send (String message)
{ {
while (true) { StreamWriter writer = new StreamWriter(Client.GetStream());
String line = Term.ReadLine (); writer.WriteLine(message);
Writer.WriteLine(line); writer.Flush();
Writer.Flush();
}
} }
} }

View File

@@ -23,29 +23,23 @@ public class Terminal
while (true) { while (true) {
ConsoleKeyInfo key = Console.ReadKey (false); ConsoleKeyInfo key = Console.ReadKey (false);
lock (TerminalLock) { lock (TerminalLock) {
if (!AcceptInput) if (!AcceptInput) {
{
Console.CursorLeft--; Console.CursorLeft--;
Console.Write (" "); Console.Write (" ");
Console.CursorLeft--; Console.CursorLeft--;
continue; continue;
} }
if (key.Key == ConsoleKey.Backspace) if (key.Key == ConsoleKey.Backspace) {
{
if (InputBuffer.Length == 0) if (InputBuffer.Length == 0)
continue; continue;
InputBuffer = InputBuffer.Substring (0, InputBuffer.Length - 1); InputBuffer = InputBuffer.Substring (0, InputBuffer.Length - 1);
ClearInputLine (); ClearInputLine ();
Console.Write (InputBuffer); Console.Write (InputBuffer);
} } else if (key.Key == ConsoleKey.Enter) {
else if (key.Key == ConsoleKey.Enter)
{
AcceptInput = false; AcceptInput = false;
ResetEvent.Set (); ResetEvent.Set ();
OutLinePos = Console.CursorTop; OutLinePos = Console.CursorTop;
} } else {
else
{
InputBuffer += key.KeyChar; InputBuffer += key.KeyChar;
ClearInputLine (); ClearInputLine ();
Console.Write (InputBuffer); Console.Write (InputBuffer);
@@ -67,12 +61,21 @@ public class Terminal
public String ReadLine () public String ReadLine ()
{ {
lock (ReadLineLock) { lock (ReadLineLock) {
try {
String result; String result;
AcceptInput = true; AcceptInput = true;
ResetEvent.WaitOne (); ResetEvent.WaitOne ();
result = InputBuffer; result = InputBuffer;
InputBuffer = ""; InputBuffer = "";
return result; return result;
} catch (ThreadAbortException e) {
lock (TerminalLock) {
AcceptInput = false;
InputBuffer = "";
ClearInputLine ();
}
throw e;
}
} }
} }