Exemplo n.º 1
0
        /// <summary>
        /// Wątek zarządzający komunikacją
        /// </summary>
        /// <param name="cli"></param>
        void ThreadWork(object cli)
        {
            Console.WriteLine("ComputationalThread has been started");
            TcpClient _cli = null;
            try
            {
                _cli = (TcpClient)cli;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Thread.CurrentThread.Interrupt();
            }
            NetworkStream ns = _cli.GetStream();

            // read data from stream
            byte[] bytes = new byte[pack_len];
            List<byte> lb = new List<byte>();
            //string packet = "";
            int read_bytes;
            bool isFullMessage = false;
            DateTime lstStarted = DateTime.Now;
            TimeSpan lstTimeout = new TimeSpan(0, 0, 10);

            do
            {
                read_bytes = ns.Read(bytes, 0, pack_len);
                Console.WriteLine("received: " + read_bytes);
                // add to list of partial read packet
                lb.AddRange(bytes.Take(read_bytes).ToArray());

                try
                {
                    new XMLParser(lb.ToArray());
                    isFullMessage = true;
                }
                catch (Exception e)
                {
                    isFullMessage = false;
                }
                //lb.Add(((byte[])bytes.Clone()));
            }
            while (!isFullMessage && (lstStarted + lstTimeout > DateTime.Now)); //(ns.DataAvailable);

            // put all data in one byte array
            //uint ps = 0;
            //foreach (byte[] b in lb)
                //ps += (uint)b.Length;

            // whole packet
            byte[] data = lb.ToArray();//new byte[ps];

            // copy data
            //int i = 0;
            //foreach (byte[] b in lb)
            //    foreach (byte _b in b)
            //        data[i++] = _b;

            // !!! CALL SERVER CONTEXT !!!
            ConnectionContext cc = new ConnectionContext(Thread.CurrentThread);
            if (ch != null)
            {
                ch(data, cc);
                // ***********************
                // waiting for event
                // ***********************
                //Thread.Sleep(Timeout.Infinite);
            }

            // interrupting by send method
            // message to send
            // test purposes
            data = cc.GetMessage();
            if (data != null)
                //data = System.Text.Encoding.ASCII.GetBytes("invalid input");
                ns.Write(data, 0, data.Length);
            _cli.Close();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Handler wywoływany przez klasę nasłuchującą.
        /// </summary>
        /// <param name="data">Odebrane dane w postaci binarnej.</param>
        /// <param name="ctx">Kontekst połączenia. Można wysłać przez niego odpowiedź do klienta który wysłal dane</param>
        private void ConnectionHandler(byte[] data, ConnectionContext ctx)
        {
            XMLParser parser;

            try
            {
                parser = new XMLParser(data);
            }
            catch (Exception e)
            {
                debug.Print("Received invalid message!");
                ctx.Send(null);
                return;
            }

            MessageObject response = null;

            switch (parser.MessageType)
            {
                case MessageTypes.Register:
                    debug.Print("Received 'Register' message.");
                    response = RegisterNewNode(parser.Message);
                    break;

                case MessageTypes.SolveRequest:
                    debug.Print("Received 'SolveRequest' message.");
                    response = RegisterNewProblem(parser.Message);
                    break;

                case MessageTypes.Status:
                    debug.Print("Received 'Status' message.");
                    response = UpdateAndGiveData(parser.Message);
                    break;

                case MessageTypes.SolutionRequest:
                    debug.Print("Received 'SolutionRequest' message.");
                    response = SendSolution(parser.Message);
                    break;

                case MessageTypes.SolvePartialProblems:
                    debug.Print("Received 'SolvePartialProblems' message.");
                    GetDividedProblem(parser.Message);
                    break;

                case MessageTypes.Solutions:
                    debug.Print("Received 'Solutions' message.");
                    GetSolutions(parser.Message);
                    break;
            }

            ctx.Send(response == null ? null : response.GetXmlData());
        }