Implementation umgebaut, sodass sie besser der Aufgabenstellung entspricht
This commit is contained in:
@@ -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();
|
||||||
TcpClient client = new TcpClient ("localhost", 9999);
|
program.startThreads();
|
||||||
Receiver receiver = new Receiver (client.GetStream (), terminal);
|
|
||||||
Sender sender = new Sender (client.GetStream (), terminal);
|
|
||||||
Thread receiverThread = new Thread (new ThreadStart (receiver.Receive));
|
|
||||||
receiverThread.Start ();
|
|
||||||
sender.Send ();
|
|
||||||
client.Close ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Program ()
|
||||||
|
{
|
||||||
|
Term = new Terminal ();
|
||||||
|
TcpClient client = new TcpClient ("localhost", 9999);
|
||||||
|
Rec = new Receiver (client);
|
||||||
|
Send = new Sender (client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startThreads ()
|
||||||
|
{
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ public class Terminal
|
|||||||
{
|
{
|
||||||
private Object TerminalLock = new Object ();
|
private Object TerminalLock = new Object ();
|
||||||
private Object ReadLineLock = new Object ();
|
private Object ReadLineLock = new Object ();
|
||||||
private AutoResetEvent ResetEvent = new AutoResetEvent(false);
|
private AutoResetEvent ResetEvent = new AutoResetEvent (false);
|
||||||
private String InputBuffer = "";
|
private String InputBuffer = "";
|
||||||
private bool AcceptInput = false;
|
private bool AcceptInput = false;
|
||||||
private int OutLinePos;
|
private int OutLinePos;
|
||||||
@@ -14,7 +14,7 @@ public class Terminal
|
|||||||
public Terminal ()
|
public Terminal ()
|
||||||
{
|
{
|
||||||
OutLinePos = Console.CursorTop;
|
OutLinePos = Console.CursorTop;
|
||||||
Thread catchInputThread = new Thread(new ThreadStart(this.CatchInput));
|
Thread catchInputThread = new Thread (new ThreadStart (this.CatchInput));
|
||||||
catchInputThread.Start ();
|
catchInputThread.Start ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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);
|
||||||
@@ -57,7 +51,7 @@ public class Terminal
|
|||||||
public void PrintLine (String s)
|
public void PrintLine (String s)
|
||||||
{
|
{
|
||||||
lock (TerminalLock) {
|
lock (TerminalLock) {
|
||||||
ClearInputLine();
|
ClearInputLine ();
|
||||||
Console.WriteLine (s);
|
Console.WriteLine (s);
|
||||||
OutLinePos = Console.CursorTop;
|
OutLinePos = Console.CursorTop;
|
||||||
Console.Write (InputBuffer);
|
Console.Write (InputBuffer);
|
||||||
@@ -67,12 +61,21 @@ public class Terminal
|
|||||||
public String ReadLine ()
|
public String ReadLine ()
|
||||||
{
|
{
|
||||||
lock (ReadLineLock) {
|
lock (ReadLineLock) {
|
||||||
String result;
|
try {
|
||||||
AcceptInput = true;
|
String result;
|
||||||
ResetEvent.WaitOne();
|
AcceptInput = true;
|
||||||
result = InputBuffer;
|
ResetEvent.WaitOne ();
|
||||||
InputBuffer = "";
|
result = InputBuffer;
|
||||||
return result;
|
InputBuffer = "";
|
||||||
|
return result;
|
||||||
|
} catch (ThreadAbortException e) {
|
||||||
|
lock (TerminalLock) {
|
||||||
|
AcceptInput = false;
|
||||||
|
InputBuffer = "";
|
||||||
|
ClearInputLine ();
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user