/// <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(); }
/// <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()); }