From 257740f2aaa6261f2f33e56453d48004292e229d Mon Sep 17 00:00:00 2001 From: Patrick Ecker Date: Thu, 26 May 2011 21:24:12 +0200 Subject: [PATCH] TCP Server created, processMessage and call according method --- CommandServer/CommandServer/MainWindow.xaml | 6 +- CommandServer/CommandServer/MainWindow.xaml.cs | 132 ++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 7 deletions(-) diff --git a/CommandServer/CommandServer/MainWindow.xaml b/CommandServer/CommandServer/MainWindow.xaml index eb641cc..b147599 100644 --- a/CommandServer/CommandServer/MainWindow.xaml +++ b/CommandServer/CommandServer/MainWindow.xaml @@ -1,10 +1,10 @@  + Title="MainWindow" Height="733" Width="935" WindowStartupLocation="CenterScreen"> - + @@ -16,7 +16,7 @@ VerticalAlignment="Stretch" /> - + diff --git a/CommandServer/CommandServer/MainWindow.xaml.cs b/CommandServer/CommandServer/MainWindow.xaml.cs index ed669b9..a21e6da 100644 --- a/CommandServer/CommandServer/MainWindow.xaml.cs +++ b/CommandServer/CommandServer/MainWindow.xaml.cs @@ -2,7 +2,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Net; +using System.Net.Sockets; using System.Text; +using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Data; @@ -21,9 +24,16 @@ namespace CommandServer { public partial class MainWindow : Window { #region members + // gui public ObservableCollection historyList { get; set; } public ObservableCollection commandProfileList { get; set; } public Action LogError; + + // communication + private TcpListener tcpListener; + private Thread listenThread; + private bool serverIsRunning = false; + #endregion public MainWindow() { @@ -43,12 +53,93 @@ namespace CommandServer { #region events + #region start server and listen + private void btnStartServer_Click(object sender, RoutedEventArgs e) { - this.Log("Server started"); + try { + serverIsRunning = true; + tcpListener = new TcpListener(IPAddress.Any, 3000); + listenThread = new Thread(new ThreadStart(ListenForClients)); + listenThread.Start(); + Log(string.Format("TCP Listener ({0}) created and server thread started", tcpListener.LocalEndpoint.ToString())); + btnStartServer.IsEnabled = false; + btnStopServer.IsEnabled = true; + } catch (Exception exc) { + Log(exc.Message); + } + } + + /// + /// listens for clients + /// + private void ListenForClients() { + this.tcpListener.Start(); + Log("TCP Listener started"); + try { + while (true) { + //blocks until a client has connected to the server + TcpClient client = this.tcpListener.AcceptTcpClient(); + Log("Client connected to server"); + + //create a thread to handle communication with connected client + Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); + clientThread.Start(client); + } + } catch (Exception exc) { + Log(exc.Message); + } } + /// + /// handles client communication + /// + /// connected client + private void HandleClientComm(object client) { + TcpClient tcpClient = (TcpClient)client; + NetworkStream clientStream = tcpClient.GetStream(); + + byte[] message = new byte[4096]; + int bytesRead; + + while (true) { + bytesRead = 0; + + try { + //blocks until a client sends a message + bytesRead = clientStream.Read(message, 0, 4096); + } catch (Exception exc) { + //a socket error has occured + Log(exc.Message); + break; + } + + if (bytesRead == 0) { + //the client has disconnected from the server + break; + } + + //message has successfully been received + ASCIIEncoding encoder = new ASCIIEncoding(); + string received = encoder.GetString(message, 0, bytesRead); + Log("Client send message: " + received); + ProcessMessage(received); + } + + tcpClient.Close(); + } + + #endregion + private void btnStopServer_Click(object sender, RoutedEventArgs e) { - this.Log("Server stopped"); + try { + serverIsRunning = false; + tcpListener.Stop(); + Log("TCP Listener stopped"); + btnStartServer.IsEnabled = true; + btnStopServer.IsEnabled = false; + } catch (Exception exc) { + Log(exc.Message); + } } private void btnSimulateForwardCommand_Click(object sender, RoutedEventArgs e) { @@ -73,6 +164,41 @@ namespace CommandServer { #region methods + private void ProcessMessage(string s) { + var profile = (CommandProfile)cbCommandProfiles.SelectedItem; + if (profile == null) { + this.Log("No profile selected"); + return; + } + switch (s) { + case "ForwardGesture": + Log("ForwardGesture received"); + profile.ForwardGesture(); + break; + case "BackwardGesture": + Log("ForwardGesture received"); + profile.BackwardGesture(); + break; + case "FlipToRightGesture": + Log("FlipToRightGesture received"); + profile.FlipToRightGesture(); + break; + case "FlipToLeftGesture": + Log("FlipToLeftGesture received"); + profile.FlipToLeftGesture(); + break; + case "GestureNotRecognized": + Log("Gesture not recognized on client"); + break; + case "Error": + Log("Error occured on Client"); + break; + default: + Log("Couldn't process message from client: " + s); + break; + } + } + private void Log(string msg) { Dispatcher.Invoke( new Action(delegate() { @@ -101,7 +227,5 @@ namespace CommandServer { } #endregion - - } } \ No newline at end of file -- 2.11.4.GIT