Mercurial > silverbladetech
diff Messaging/Client/Sockets/AsynchronousClient.cs @ 26:045dac571339
Working on data binding to a user control
author | adminsh@apollo |
---|---|
date | Wed, 21 Mar 2012 15:39:53 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Messaging/Client/Sockets/AsynchronousClient.cs Wed Mar 21 15:39:53 2012 +0000 @@ -0,0 +1,187 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace Client.Sockets +{ + public class AsynchronousClient + { + // The port number for the remote device. + private const int Port = 11000; + + // ManualResetEvent instances signal completion. + private static readonly ManualResetEvent connectDone = + new ManualResetEvent(false); + + private static readonly ManualResetEvent sendDone = + new ManualResetEvent(false); + + private static readonly ManualResetEvent receiveDone = + new ManualResetEvent(false); + + // The response from the remote device. + private static String response = String.Empty; + + private static void StartClient() + { + // Connect to a remote device. + try + { + // Establish the remote endpoint for the socket. + // The name of the + // remote device is "host.contoso.com". + var ipHostInfo = Dns.GetHostEntry("host.contoso.com"); + var ipAddress = ipHostInfo.AddressList[0]; + var remoteEP = new IPEndPoint(ipAddress, Port); + + // Create a TCP/IP socket. + var client = new Socket( + AddressFamily.InterNetwork, + SocketType.Stream, + ProtocolType.Tcp); + + // Connect to the remote endpoint. + client.BeginConnect( + remoteEP, + ConnectCallback, + client); + + connectDone.WaitOne(); + + // Send test data to the remote device. + Send(client, "This is a test<EOF>"); + sendDone.WaitOne(); + + // Receive the response from the remote device. + Receive(client); + receiveDone.WaitOne(); + + // Write the response to the console. + Console.WriteLine("Response received : {0}", response); + + // Release the socket. + client.Shutdown(SocketShutdown.Both); + client.Close(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + private static void ConnectCallback(IAsyncResult ar) + { + try + { + // Retrieve the socket from the state object. + var client = (Socket) ar.AsyncState; + + // Complete the connection. + client.EndConnect(ar); + + Console.WriteLine( + "Socket connected to {0}", + client.RemoteEndPoint); + + // Signal that the connection has been made. + connectDone.Set(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + private static void Receive(Socket client) + { + try + { + // Create the state object. + var state = new StateObject {WorkSocket = client}; + + // Begin receiving the data from the remote device. + client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, + ReceiveCallback, state); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + private static void ReceiveCallback(IAsyncResult ar) + { + try + { + // Retrieve the state object and the client socket + // from the asynchronous state object. + var state = (StateObject) ar.AsyncState; + var client = state.WorkSocket; + + // Read data from the remote device. + var bytesRead = client.EndReceive(ar); + + if (bytesRead > 0) + { + // There might be more data, so store the data received so far. + state.Sb.Append(Encoding.ASCII.GetString(state.Buffer, 0, bytesRead)); + + // Get the rest of the data. + client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, + ReceiveCallback, state); + } + else + { + // All the data has arrived; put it in response. + if (state.Sb.Length > 1) + { + response = state.Sb.ToString(); + } + // Signal that all bytes have been received. + receiveDone.Set(); + } + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + private static void Send(Socket client, String data) + { + // Convert the string data to byte data using ASCII encoding. + var byteData = Encoding.ASCII.GetBytes(data); + + // Begin sending the data to the remote device. + client.BeginSend( + byteData, + 0, + byteData.Length, + 0, + SendCallback, + client); + } + + private static void SendCallback(IAsyncResult ar) + { + try + { + // Retrieve the socket from the state object. + var client = (Socket) ar.AsyncState; + + // Complete sending the data to the remote device. + var bytesSent = client.EndSend(ar); + Console.WriteLine("Sent {0} bytes to server.", bytesSent); + + // Signal that all bytes have been sent. + sendDone.Set(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + } +} \ No newline at end of file