示例#1
0
        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 + ".");
        }
示例#2
0
        /// <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 + ".");
            }
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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 + ".");
        }
示例#5
0
        /// <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);
        }