I basically try to reproduce the Socket example from here: http://www.silverlightshow.net/items/Sockets-and-their-implementation-in-SL2-Beta-1-including-a-chat-like-example.aspx. I have been able to get the message send from Client To Server using the following code. But how can the server response to client?
Client Code:
String safeHost = Application.Current.Host.Source.DnsSafeHost;
int port = 4509;
socketClient = new SocketClient(
safeHost,
port);
socketClient.Connected += new EventHandler(socketClient_Connected);
socketClient.Connect();
}
Send();
}
void socketClient_Connected(object sender, EventArgs e)
{
//Say("Connected");
//ConnectButton.Content = "Disconnect";
}
private void Send()
{
if (socketClient.IsConnected)
{
socketClient.SendReceive("Test Message");
//Say("you said: " + Keyboard.Text);
}
}
Server Code:
public class StateObject { // Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 1024; // Receive buffer. public byte[] buffer = new byte[ BufferSize ]; // Received data string. public StringBuilder sb = new StringBuilder(); }
public class AsynchronousSocketListener { // Thread signal. public static ManualResetEvent allDone = new ManualResetEvent( false );
public AsynchronousSocketListener()
{
}
public static void StartListening()
{
// Data buffer for incoming data.
byte[] bytes = new Byte[ 1024 ];
// Establish the local endpoint for the socket.
// The DNS name of the computer
// running the listener is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.GetHostEntry( Dns.GetHostName() );
IPAddress ipAddress = // localhost
IPAddress.Parse( "127.0.0.1" );
IPEndPoint localEndPoint = //4509 is one of the available
//ports in Silverlight 2 Beta 1
new IPEndPoint( ipAddress, 4509 );
// Create a TCP/IP socket.
Socket listener = new Socket( AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp );
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
listener.Bind( localEndPoint );
listener.Listen( 100 );
while( true )
{
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine( "Waiting for a connection..." );
listener.BeginAccept(
new AsyncCallback( AcceptCallback ),
listener );
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
}
catch( Exception e )
{
Console.WriteLine( e.ToString() );
}
Console.WriteLine( "\nPress ENTER to continue..." );
Console.Read();
}
public static void AcceptCallback( IAsyncResult ar )
{
// Signal the main thread to continue.
allDone.Set();
// Get the socket that handles the client request.
Socket listener = ( Socket )ar.AsyncState;
Socket handler = listener.EndAccept( ar );
// Create the state object.
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback( ReadCallback ), state );
}
public static void ReadCallback( IAsyncResult ar )
{
String content = String.Empty;
// Retrieve the state object and the handler socket
// from the asynchronous state object.
StateObject state = ( StateObject )ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket.
//byte[] buffer = new byte[1024];
int bytesRead = handler.EndReceive( ar );
if( bytesRead > 0 )
{
// There might be more data, so store the data received so far.
state.sb = new StringBuilder();
state.sb.Append( Encoding.ASCII.GetString(
state.buffer, 0, bytesRead ) );
// Check for end-of-file tag. If it is not there, read
// more data.
content = //( String )buffer.ToString();
state.sb.ToString();
if( content.IndexOf( "<EOF>" ) > -1 )
{
//All the data has been read from the
//client. Display it on the console.
Console.WriteLine( "Client quit: {1}",
content.Length, content );
//Echo the data back to the client.
//Send( handler, content );
handler.Shutdown( SocketShutdown.Both ); handler.Close();
}
else
{
Console.WriteLine( "Client said: {1}",
content.Length, content );
// Not all data received. Get more.
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback( ReadCallback ), state );
}
}
}
private static void Send( Socket handler, String data )
{
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes( data );
// Begin sending the data to the remote device.
handler.BeginSend( byteData, 0, byteData.Length, 0,
new AsyncCallback( SendCallback ), handler );
}
private static void SendCallback( IAsyncResult ar )
{
try
{
// Retrieve the socket from the state object.
Socket handler = ( Socket )ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend( ar );
Console.WriteLine( "Sent {0} bytes to client.", bytesSent );
handler.Shutdown( SocketShutdown.Both );
handler.Close();
}
catch( Exception e )
{
Console.WriteLine( e.ToString() );
}
}
public static int Main( String[] args )
{
PolicyServer ps = new PolicyServer();
ps.Start();
StartListening();
//then when shutting down
ps.Stop();
return 0;
}