Beispiel #1
0
        public ControllerMain(IModel modelMain, ViewMain viewMain, ViewAddProject viewAdd,
                              ViewEvaluation viewEvaluation)
        {
            mModelMain      = modelMain;
            mViewMain       = viewMain;
            mViewAddProject = viewAdd;
            mViewEvaluation = viewEvaluation;
            mViewMain.setController(this);
            mViewAddProject.setController(this);
            mViewEvaluation.setController(this);

            ChangeStatus(ClientStati.NotConnected);
            msgClass = new MyMessageClass(mModelMain.MyData.Number);

            //CreateChannel();
            CreateThreads();

#if TestList
            mModelMain.mProjects = new List <Project>()
            {
                new Project("12345", new TimeSpan(1, 0, 0)),
                new Project("23456", new TimeSpan(2, 0, 0)),
                new Project("34567", new TimeSpan(3, 0, 0))
            };
            mViewMain.UpdateProjects(mModelMain.mProjects);
#endif
        }
Beispiel #2
0
        /// <summary>
        /// Listens for calls from the clients.
        /// </summary>
        /// <param name="stateInfo"></param>
        static void SocketThread(Object stateInfo)
        {
            Socket server_TcpSocket = null;

            try
            {
                IPEndPoint server_Address = new IPEndPoint(IPAddress.Any, SERVER_PORT);
                server_TcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                server_TcpSocket.Bind(server_Address);

                byte[]         receivedData;
                int            dataCount;
                int            index;
                string         receivedMsg;
                typeMessage    msgType;
                string         msgData;
                string         msgHeader;
                MyMessageClass msgClass = new MyMessageClass(SERVER_ID); //-99... Server
                byte[]         response = new byte[MyMessageClass.BUFFER_SIZE_BYTE];

                server_TcpSocket.Listen(10);

                while (Run)
                {
                    //Blocking call for accepting requests.
                    Socket client_TcpSocket = server_TcpSocket.Accept();

                    //Address of the client:
                    IPEndPoint client_Address = (IPEndPoint)client_TcpSocket.RemoteEndPoint;

                    receivedData = new byte[MyMessageClass.BUFFER_SIZE_BYTE];
                    dataCount    = client_TcpSocket.Receive(receivedData);
                    if (dataCount != 0)
                    {
                        receivedMsg = Encoding.ASCII.GetString(receivedData, 0, dataCount);
                        msgHeader   = msgClass.getMessageHeader(receivedMsg);
                        msgData     = msgClass.getMessageData(receivedMsg);
                        msgType     = msgClass.getMessageType(msgHeader);
                        ClientData client;

                        switch (msgType)
                        {
                        case typeMessage.MSG_CONNECT:
                            client         = msgClass.ParseDataToClientData(msgType, msgData);
                            client.Number  = mServer.ClientNumber;
                            client.Address = client_Address;
                            client.Status  = ClientStati.Connected;
                            index          = mServer.FindClientIndex(client);
                            if (index == -1)
                            {
                                mServer.AddClient(client);
                            }
                            else
                            {
                                client = mServer.GetClientList()[index];
                            }
                            client.LastHeartBeat = DateTime.Now;
                            response             = msgClass.ConnectResponse(client, mServer.GetProjectListHash());
                            Console.WriteLine("Client added!");
                            break;

                        case typeMessage.MSG_NEWPROJECT:
                            mServer.AddProject(new Project(msgData));
                            response           = msgClass.NewProjectResponse(mServer.GetProjectListHash());
                            ProjectListChanged = true;
                            Console.WriteLine("Project added!");
                            break;

                        case typeMessage.MSG_ADDTIME:
                            Project tmp = msgClass.ParseDataToProject(typeMessage.MSG_ADDTIME, msgData);
                            response = mServer.UpdateTime(tmp)
                                    ? msgClass.AddTimeResponse(mServer.GetProjectListHash())
                                    : msgClass.AddTimeResponseError();
                            ProjectListChanged = true;
                            Console.WriteLine("Time added to project!");
                            break;

                        case typeMessage.MSG_HEARTBEAT:
                            client = msgClass.ParseDataToClientData(msgType, msgData);
                            index  = mServer.FindClientIndex(client);
                            if (index == -1)
                            {
                                throw new ArgumentOutOfRangeException();
                            }

                            mServer.GetClientList()[index].LastHeartBeat = DateTime.Now;
                            response = msgClass.HeartBeatResponse(mServer.GetClientList()[index],
                                                                  mServer.GetProjectListHash());
                            Console.WriteLine("HeartBeat to Client: " + index);
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }

                        // send response
                        client_TcpSocket.Send(response, response.Length, SocketFlags.None);
                    }

                    client_TcpSocket.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error:\n" + e.Message);
            }
            finally
            {
                server_TcpSocket.Close();
            }
        }
Beispiel #3
0
        /// <summary>
        /// Thread for a Socket-Connection
        /// </summary>
        /// <param name="stateInfo"></param>
        void SocketThread(Object stateInfo)
        {
            while (true)
            {
                string      receivedMsg;
                string      msgHeader;
                string      msgData;
                typeMessage msgType;
                ClientData  tmp;

                switch (mModelMain.MyData.Status)
                {
                case ClientStati.Connected:
                    try
                    {
                        // if addTime or addProject message is waiting
                        if (Message != null)
                        {
                            receivedMsg = SendToReceiveFromServer(Message);
                            Message     = null;
                            if (receivedMsg != "")
                            {
                                msgHeader = msgClass.getMessageHeader(receivedMsg);
                                msgData   = msgClass.getMessageData(receivedMsg);
                                msgType   = msgClass.getMessageType(msgHeader);
                                switch (msgType)
                                {
                                case typeMessage.MSG_NEWPROJECT:
                                    CheckHashValue();
                                    break;

                                case typeMessage.MSG_ADDTIME:
                                    CheckHashValue();
                                    break;

                                case typeMessage.MSG_ADDTIMEERROR:
                                    // @Dominik: is da sunsd nu was zu tun? irgendwie drauf reagieren?
                                    // @Neuwirt: Eventuell in des LOG-File schreibn? und später nochmal probieren?
                                    throw new Exception("Adding time failed");
                                    break;

                                default:
                                    throw new Exception("Wrong message type received");
                                }
                            }
                        }
                        // message in file
                        else if (MessageWaiting)
                        {
                            if (File.Exists(FILEPATH))
                            {
                                try
                                {
                                    if (new FileInfo(FILEPATH).Length != 0)
                                    {
                                        List <string> lines = File.ReadAllLines(FILEPATH).ToList();
                                        if (lines.Count != 0)
                                        {
                                            Message = Encoding.ASCII.GetBytes(lines.First());
                                            lines.RemoveAt(0);
                                            File.WriteAllLines(FILEPATH, lines);
                                        }
                                    }
                                    else
                                    {
                                        MessageWaiting = false;
                                    }
                                }
                                catch
                                {
                                    MessageWaiting = false;
                                    throw new Exception("Command file corrupted");
                                }
                            }
                            else
                            {
                                MessageWaiting = false;
                                throw new Exception("Command file missing");
                            }
                        }
                        // else send heartbeat
                        else
                        {
                            byte[] thisData = msgClass.HeartBeatMessage(mModelMain.MyData);
                            receivedMsg = SendToReceiveFromServer(thisData);
                            msgHeader   = msgClass.getMessageHeader(receivedMsg);
                            msgData     = msgClass.getMessageData(receivedMsg);
                            msgType     = msgClass.getMessageType(msgHeader);

                            if (msgType == typeMessage.MSG_HEARTBEATRESPONSE)
                            {
                                mModelMain.MyData.LastHeartBeat  = DateTime.Now;
                                mModelMain.ServerProjectListHash = msgClass.ParseDataToHashValue(msgType, msgData);
                                CheckHashValue();
                            }
                            else
                            {
                                throw new Exception("Disconnected");
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        ChangeStatus(ClientStati.NotConnected);
                        ShowError(e);
                    }
                    break;

                default:
                    byte[] dataToSend = msgClass.ConnectMessage(mModelMain.MyData);
                    try
                    {
                        receivedMsg = SendToReceiveFromServer(dataToSend);
                        if (receivedMsg != "")
                        {
                            msgHeader = msgClass.getMessageHeader(receivedMsg);
                            msgData   = msgClass.getMessageData(receivedMsg);
                            msgType   = msgClass.getMessageType(msgHeader);

                            if (msgType != typeMessage.MSG_CONNECTRESPONSE)
                            {
                                throw new Exception("Wrong message type received");
                            }

                            tmp = msgClass.ParseDataToClientData(msgType, msgData);

                            if (tmp.Name.Equals(mModelMain.MyData.Name))
                            {
                                mModelMain.MyData = tmp;
                                ChangeStatus(ClientStati.Connected);
                                mModelMain.MyData.LastHeartBeat  = DateTime.Now;
                                mModelMain.ServerProjectListHash = msgClass.ParseDataToHashValue(msgType, msgData);
                                msgClass = new MyMessageClass(mModelMain.MyData.Number);
                                CheckHashValue();
                            }
                            else
                            {
                                throw new Exception("Wrong client number/name!");
                            }
                        }
                        else
                        {
                            ChangeStatus(ClientStati.NotConnected);
                        }
                    }
                    catch (Exception e)
                    {
                        ChangeStatus(ClientStati.NotConnected);
                        ShowError(e);
                    }
                    break;
                }
                Thread.Sleep(TIMEOUT);
            }
        }
Beispiel #4
0
    static void Main()
    {
        var msg = new MyMessageClass();

        msg.AddMessageAsync("content", TimeSpan.MaxValue, TimeSpan.MaxValue, new CancellationToken());
    }