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. int bytesRead = handler.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)); // Check for end-of-file tag. If it is not there, read // more data. content = state.sb.ToString(); if (content.IndexOf("<EOF>") > -1) { // All the data has been read from the // client. Display it on the console. MessageCollection.GetInstance().AddListOfMessages(UtilityFunctions.MessageParser(content)); Logger.GetInstance().NotifyAll("Received a message"); // TODO: Add notif that promts new message // Send response while (!MessageCollection.GetInstance().IsLastMessage()) { send(handler, MessageCollection.GetInstance().NextMessage().Call()); } } else { // Not all data received. Get more. handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } } }
public void StartReceiving(ITextChanger ipText) { TcpListener server = null; try { // Set the TcpListener on port 13000. Int32 port = 13000; IPAddress localAddress = IPAddress.Parse(ipv4Address); ipText.ChangeText(localAddress.MapToIPv4().ToString()); server = new TcpListener(localAddress, port); // Start listening for client requests. server.Start(); // Buffer for reading data Byte[] bytes = new Byte[256]; String data = null; // Enter the listening loop. while (true) { Logger.GetInstance().NotifyAll("Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also use server.AcceptSocket() here. TcpClient client = server.AcceptTcpClient(); Logger.GetInstance().NotifyAll("Connected!"); data = null; // Get a stream object for reading and writing NetworkStream stream = client.GetStream(); int i; // Loop to receive all the data sent by the client. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { // Translate data bytes to a ASCII string. data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); Logger.GetInstance().NotifyAll("Received: " + data); List <Message> newMessage = UtilityFunctions.MessageParser(data); MessageCollection.GetInstance().AddListOfMessages(newMessage); // Process the data sent by the client. //data = data.ToUpper(); byte[] msg = System.Text.Encoding.ASCII.GetBytes(newMessage[0].Call()); // Send back a response. stream.Write(msg, 0, msg.Length); Logger.GetInstance().NotifyAll("Sent: " + data); } // Shutdown and end connection //client.Close(); } } catch (SocketException e) { Logger.GetInstance().NotifyAll("SocketException: " + e); } finally { // Stop listening for new clients. server.Stop(); Logger.GetInstance().NotifyAll("Server has stopped listening"); } }