private static void SendMessage(String message, ReceivedBufferObject toClient) { byte[] byteData = Encoding.ASCII.GetBytes(message); toClient.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), toClient.socket); Console.WriteLine("Sending: " + message + "to Client " + toClient.ClientNumber + "."); }
/// <summary> /// When a client connects to the server successfully, the callback to join will be made to receive the client's messages. /// </summary> private static void JoinCallback(IAsyncResult ar) { ReceivedBufferObject storageContainer = (ReceivedBufferObject)ar.AsyncState; Socket clientSocket = storageContainer.socket; // read data from client as much as specified ReceivedBufferObject allowed int readPacketData = clientSocket.EndReceive(ar); // if 0 bytes were read, client shutdown socket, and all available data has been received. if (readPacketData > 0) { // convert data to string and store in the state object string message = Encoding.ASCII.GetString(storageContainer.buffer, 0, readPacketData); storageContainer.Data += message; // if the end of the data was found, we're done if (message.IndexOf('\n') > -1) { Console.WriteLine("Client " + storageContainer.ClientNumber + " sent message: " + storageContainer.Data); // echo changes to other clients lock (lockCount) { foreach (ReceivedBufferObject player in playerList) { if (player.ClientNumber != storageContainer.ClientNumber) { SendMessage(storageContainer.ClientNumber + " " + storageContainer.Data, player); } } } storageContainer.Data = ""; // ask for more messages clientSocket.BeginReceive(storageContainer.buffer, 0, storageContainer.buffer.Length, SocketFlags.None, new AsyncCallback(JoinCallback), storageContainer); } // otherwise, retrieve more data else { Console.WriteLine("Client " + storageContainer.ClientNumber + " sent partial message."); clientSocket.BeginReceive(storageContainer.buffer, 0, storageContainer.buffer.Length, SocketFlags.None, new AsyncCallback(JoinCallback), storageContainer); } } else { Console.WriteLine("Warning: 0 packet sent from client " + storageContainer.ClientNumber + "."); } }
/// <summary> /// Callback is made once connection is successfully made with a client. /// Handle client request with a new socket. /// </summary> private static void ConnectionCallback(IAsyncResult ar) { // allow the listener to continue with new threads mre.Set(); Console.WriteLine("Client connected."); // create socket that handles clients Socket connection = ((Socket)ar.AsyncState).EndAccept(ar); // create an object that will store the received data from the client ReceivedBufferObject storageContainer; lock (lockCount) { clientCount++; storageContainer = new ReceivedBufferObject(connection, clientCount); playerList.Add(storageContainer); } Console.WriteLine("Waiting for message from client " + storageContainer.ClientNumber + "..."); // wait for message from client connection.BeginReceive(storageContainer.buffer, 0, storageContainer.buffer.Length, SocketFlags.None, new AsyncCallback(JoinCallback), storageContainer); }