/// <summary> /// Method that is performed when a new user is disconnected. /// </summary> /// <param name="sender">The object that sent this message</param> /// <param name="user">The user that needs to be disconnected</param> private void user_UserDisconnected(object sender, Client user) { connectedClients--; //Send a message to every other client notifying them on a removed client, if the setting is set to True if (Properties.Settings.Default.SendMessageToClientsWhenAUserIsRemoved) { writeStream.Position = 0; //Write in the form {Protocol}{User_ID}{User_IP} writer.Write(Properties.Settings.Default.DisconnectedPlayerByteProtocol); writer.Write(user.id); writer.Write(user.IP); SendData(GetDataFromMemoryStream(writeStream), user); } //Print the removed player message to the server window. Console.WriteLine(user.ToString() + " disconnected\tConnected Clients: " + connectedClients + "\n"); //Clear the array's index client[user.id] = null; }
/// <summary> /// Relay messages sent from one client and send them to others /// </summary> /// <param name="sender">The object that called this method</param> /// <param name="data">The data to relay</param> private void user_DataReceived(Client sender, byte[] data) { writeStream.Position = 0; if (Properties.Settings.Default.EnableSendingIPAndIDWithEveryMessage) { //Append the id and IP of the original sender to the message, and combine the two data sets. writer.Write(sender.id); writer.Write(sender.IP); data = CombineData(data, writeStream); } //If we want the original sender to receive the same message it sent, we call a different method if (Properties.Settings.Default.SendBackToOriginalClient) { SendData(data); } else { SendData(data, sender); } }
/// <summary> /// Sends a message to every client except the source. /// </summary> /// <param name="data">Data to send</param> /// <param name="sender">Client that should not receive the message</param> private void SendData(byte[] data, Client sender) { foreach (Client c in client) { if (c != null && c != sender) { c.SendData(data); } } //Reset the writestream's position writeStream.Position = 0; }
/// <summary> /// Method that is performed when a new user is added. /// </summary> /// <param name="sender">The object that sent this message</param> /// <param name="user">The user that needs to be added</param> private void listener_userAdded(object sender, Client user) { connectedClients++; //Send a message to every other client notifying them on a new client, if the setting is set to True if (Properties.Settings.Default.SendMessageToClientsWhenAUserIsAdded) { writeStream.Position = 0; //Write in the form {Protocol}{User_ID}{User_IP} writer.Write(Properties.Settings.Default.NewPlayerByteProtocol); writer.Write(user.id); writer.Write(user.IP); SendData(GetDataFromMemoryStream(writeStream), user); } //Set up the events user.DataReceived += new DataReceivedEvent(user_DataReceived); user.UserDisconnected += new ConnectionEvent(user_UserDisconnected); //Print the new player message to the server window. Console.WriteLine(user.ToString() + " connected\tConnected Clients: " + connectedClients + "\n"); //Add to the client array client[user.id] = user; }
/// <summary> /// Called when a client connects to the server /// </summary> /// <param name="ar">Status of the Async method</param> private void AcceptClient(IAsyncResult ar) { //We need to end the Async method of accepting new clients TcpClient client = listener.EndAcceptTcpClient(ar); //id is originally -1 which means a user cannot connect int id = -1; for (byte i = 0; i < usedUserID.Length; i++) { if (usedUserID[i] == false) { id = i; break; } } //If the id is still -1, the client what wants to connect cannot (probably because we have reached the maximum number of clients if (id == -1) { Console.WriteLine("Client " + client.Client.RemoteEndPoint.ToString() + " cannot connect. "); return; } //ID is valid, so create a new Client object with the server ID and IP usedUserID[id] = true; Client newClient = new Client(client, (byte)id); //We are now connected, so we need to set up the User Disconnected event for this user. newClient.UserDisconnected += new ConnectionEvent(client_UserDisconnected); //We are now connected, so call all delegates of the UserAdded event. if (userAdded != null) userAdded(this, newClient); //Begin listening for new clients ListenForNewClient(); }
/// <summary> /// User disconnects from the server /// </summary> /// <param name="sender">Original object that called this method</param> /// <param name="user">Client to disconnect</param> void client_UserDisconnected(object sender, Client user) { usedUserID[user.id] = false; }