Пример #1
0
        private static async void StartServer(object sender, RoutedEventArgs e)
        {
            if (System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners().Any(p => p.Port == 15000))
            {
                if (!simultaneousErrorDialog.IsVisible)
                {
                    await window.ShowMetroDialogAsync(simultaneousErrorDialog);
                }
                simultaneousErrorDialog.MessageText.Content = "Error when starting server- UDP port already occupied. Check whether there is another instance running";
                Console.Out.WriteLine("[NetworkManager] error when starting server- UDP port already occupied. Check whether there is another instance running");
                return;
            }

            server = new Server();

            connected    = true;
            clientNumber = 0;
            clientCount  = 0;

            //client view object for displaying in the network page
            ClientViewObject.Add(clientNumber, NetworkUtil.GetMachineName(), NetworkUtil.GetLocalIPAddress());

            //TODO: add -= when server shut down?
            server.MessageReceivedFromClientEvent += MessageReceivedFromClient;
            server.ClientConnectedEvent           += ClientConnected;
            server.ClientDisconnectedEvent        += ClientDisconnected;


            //load all patient in registered patient after starting server, the client will load the patient via requesting
            PatientManager.LoadAllPatientFromSchedular();
            PatientManager.LoadAllPatient();

            //load all the injection after starting server, the client will load the injection via contacting with server
            InjectionsManager.loadAllInjections();

            if (twoChoiceDialog.IsVisible)
            {
                await window.HideMetroDialogAsync(twoChoiceDialog);
            }
            await window.ShowMessageAsync("No server found. \nStarted as server instead!", "Server Name: " + NetworkUtil.GetMachineName() + "\nServer IP:" + NetworkUtil.GetLocalIPAddress());
        }
Пример #2
0
        /// <summary>
        /// Handle message if client send anything to the server
        ///
        /// The message contain two part,
        /// first part is a identifier (string) to distinguish what type of message is it
        /// second part is the message content
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public static void MessageReceivedFromClient(object sender, MessageReceivedFromClientEventArgs args)
        {
            string[] messages = Encoding.UTF8.GetString(args.Data).Split(new char[] { '_' }, 2);
            try
            {
                Console.Out.WriteLine("[NetworkManager-Server] Recieved message type: " + messages[0]);
                Console.Out.WriteLine("[NetworkManager-Server] The message is: " + messages[1]);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e);
            }

            switch (messages[0])
            {
            case "ConnectionSucessful":
                Console.Out.WriteLine("[NetworkManager-Server] New connection established with client IP: {0}, Name: {1}", args.IpPort, messages[1]);
                window.Dispatcher.Invoke(() =>
                {
                    //Send the clientNumber to the client
                    clientCount += 1;
                    Console.Out.WriteLine("[NetworkManager-Server] Setting client with IPPort: {0} as client number {1}", args.IpPort, clientCount);
                    server.TCPSendMessage(args.IpPort, "setClientNumber", clientCount.ToString());

                    //Add the client view object for networking page
                    ClientViewObject.Add(clientCount, messages[1], args.IpPort);
                });
                break;

            case "modInjection":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving Mod Injection Request from client, proceed to modify injection");
                window.Dispatcher.Invoke(() =>
                {
                    server.TCPBroadcastMessage("modInjection", messages[1]);
                    InjectionsManager.modInjection(XElement.Parse(messages[1]));
                });
                break;

            case "requestInitialInjection":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving Initial Injection Request from client, proceed to send all injection to client with ip: {0}", args.IpPort);
                foreach (Injection injection in InjectionsManager.injections)
                {
                    server.TCPSendMessage(args.IpPort, "modInjection", injection.toXML().ToString());
                }
                break;

            case "requestInitialPatient":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving Initial Patient Request from client, proceed to send all patient to client with ip: {0}", args.IpPort);
                foreach (Patient patient in PatientManager.Patients)
                {
                    server.TCPSendMessage(args.IpPort, "addPatient", patient.toXML().ToString());
                }
                break;

            //////////////////////////////////////////////////
            ////////    Obsolete    //////////////////////////
            case "dischargeInjection":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving discharge Injection Request from client, proceed to discharge injection");
                window.Dispatcher.Invoke(() =>
                {
                    server.TCPBroadcastMessage("dischargeInjection", messages[1]);
#pragma warning disable CS0618 // Type or member is obsolete
                    InjectionsManager.dischargeInjection(messages[1]);
#pragma warning restore CS0618 // Type or member is obsolete
                });
                break;
            //////////////////////////////////////////////////

            case "changePatientStatus":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving changePatientStatus Request from client, proceed to change PatientStatus");
                window.Dispatcher.Invoke(() =>
                {
                    server.TCPBroadcastMessage("changePatientStatus", messages[1]);
                    //try to splite the message back to (accessionNumber, patientStatus)
                    if (messages[1].Split('^').Length == 2)
                    {
                        InjectionsManager.changePatientStatus(messages[1].Split('^')[0], messages[1].Split('^')[1]);
                    }
                    else
                    {
                        Console.Out.WriteLine("[NetworkManager-Server_changePatientStatus()] Corrupted changePatientStatus message, require 2 input. Message: " + messages[1]);
                    }
                });

                break;

            case "removeInjection":
                Console.Out.WriteLine("[NetworkManager-Server] Receiving remove Injection Request from client, proceed to remove injection");
                window.Dispatcher.Invoke(() =>
                {
                    server.TCPBroadcastMessage("removeInjection", messages[1]);
                    InjectionsManager.removeInjection(messages[1]);
                });
                break;

            default:
                Console.Error.WriteLine("[NetworkManager-Server] Unhandled message type: " + messages[0]);
                break;
            }

            try
            {
                window.Dispatcher.Invoke(() =>
                {
                    ClientViewObject.GetClientViaIP(args.IpPort).UpdateMessage(messages[0], messages[1]);
                });
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e);
            }
        }