Ejemplo n.º 1
0
        private string ReadStream(string line)
        {
            Byte[] recivedData = new Byte[1024];
            Byte[] emptyData   = Encoding.GetEncoding(1251).GetBytes("");

            try
            {
                if (TCPClient.Available > 0)
                {
                    StringBuilder SB = new StringBuilder();
                    while (TCPClient.Available > 0)
                    {
                        int streamLength = TCPStream.Read(recivedData, 0, recivedData.Length);
                        SB.Append(Encoding.GetEncoding(1251).GetString(recivedData, 0, streamLength));
                    }
                    string sbResult = SB.ToString();

                    if (!string.IsNullOrEmpty(line))
                    {
                        return(string.Concat(line, sbResult));
                    }

                    return(sbResult);
                }
                else if (waitForConfirmationReply)
                {
                    lock (this)
                    {
                        int milisecondsElapsed = (int)((TimeSpan)(DateTime.Now - actualLastPackageTime)).TotalMilliseconds;
                        if (milisecondsElapsed > 500)
                        {
                            //Trace.WriteLine(string.Format("WaitForConfirmationReply package.PackageID = {0};\t{1}",
                            //    lastPackageId, DateTime.Now));

                            TCPStream.Write(packageConfirmation, 0, packageConfirmation.Length);
                            actualLastPackageTime = DateTime.Now;
                        }
                    }
                }

                lock (this)
                {
                    TCPStream.Write(emptyData, 0, emptyData.Length);
                }
                // if anybody comment next string, CPU will die with five or more client connections

                if (NeedToUpdate)
                {
                    SendUpdate();
                    return(null);
                }

                string packageId;
                long   MSecDiff = (DateTime.Now.Ticks - lastTimePingSent) / 10000;
                if (
                    //false &&
                    (NeedToPing && !PingSent && MSecDiff >= 700))
                {
                    // TestString length is 100 bytes
                    const string TestString = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";

                    StringBuilder sb = new StringBuilder(TestString);
                    for (int i = 0; i < 0; i++)
                    {
                        sb.Append(TestString);
                    }


                    WriteStream(PackageViaWireless.BuildPackage(0, "Ping", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(DateTime.Now.Ticks.ToString(), sb.ToString()), false, out packageId), packageId);
                    PingSent = true;
                    return(null);
                }

                //MSecDiff = (DateTime.Now.Ticks - lastTimeMessageCheck) / 10000;
                if (ClientCode == "")
                {       // Еще не известно для кого проверять наличие сообщения
                    Byte[] answer;
                    if (NewConnection)
                    {
                        answer = PackageViaWireless.BuildPackage(0, "TimeSynchronization", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")), false, out packageId);
                        // Sending answer
                        WriteStream(answer, packageId);

                        NewConnection = false;
                    }
                    if (KeyPress != 0)
                    {
                        answer = PackageViaWireless.BuildPackage(0, "KeyPressing", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(KeyPress), false, out packageId);
                        WriteStream(answer, packageId);
                        KeyPress = 0;
                    }

                    if (SendBarcode != null)
                    {
                        answer = PackageViaWireless.BuildPackage(0, "BarcodeEvent", Aramis.Net.PackageConvertation.GetStrPatametersFromArray(SendBarcode), false, out packageId);
                        WriteStream(answer, packageId);
                        SendBarcode = null;
                    }

                    Thread.Sleep(100);
                    return(null);
                }
            }
            catch (Exception exp)
            {     /* I just was unable to find other way for inform TcpClient about connection death.
                   *    /* Without attempt of writing empty string to stream the property "Available" return
                   *    /* wrong value, for example "TRUE" when client went to dining room :) */
                Console.Write("Disconnecting for machine [ {0} ], thread {1}. Exp:{2}", IPAddress, Thread.CurrentThread.GetHashCode(), exp.Message);
                CloseChannels();
                return("");
            }
        }