Ejemplo n.º 1
0
        private void run(object cb)
        {
            heartBeatTimer.Enabled = true;
            IHostServiceCallback callback = cb as IHostServiceCallback;

            try {
                while (true)
                {
                    Common.Package request = null;
                    lock (readLock) {
                        request = Common.PackageHelper.GetRequest(streamToClient);
                        LOGGER.InfoFormat("Receive package {0} from client {1}!", request.ToString(),
                                          clientNum == 0 ? tcpclient.Client.RemoteEndPoint.ToString() : clientNum.ToString());
                    }
                    Common.Package response = PackageHandler.Deal(this, request, callback);
                    if (response.Cat == 1)
                    {
                        new System.Threading.Thread(WriteLog).Start(
                            new Tuple <byte, int, int, float, float>(clientNum, 0, 0, 0, 0));
                    }
                    SendPackage(response);
                }
            } catch (IOException e) {
                LOGGER.WarnFormat("Client {0} stop run, maybe close!", this.ClientNum, e);
            } catch (System.Threading.ThreadAbortException) {
                LOGGER.WarnFormat("Client {0} has been aborted!", this.ClientNum);
            } finally {
                WriteLog(new Tuple <byte, int, int, float, float>(clientNum, 1, this.ClientStatus.RealSpeed, this.ClientStatus.NowTemperature, this.ClientStatus.Cost));
                heartBeatTimer.Enabled = false;
                lock (this) {
                    this.clientStatus.Speed     = (int)ESpeed.Unauthorized;
                    this.ClientStatus.RealSpeed = (int)ESpeed.NoWind;
                }
                if (streamToClient != null)
                {
                    streamToClient.Dispose();
                }
                if (tcpclient != null)
                {
                    tcpclient.Close();
                }
                callback.RemoveClient(this.clientNum);
            }
        }
Ejemplo n.º 2
0
 private void SendPackage(Common.Package package)
 {
     try {
         if (package.Cat == -1)
         {
             return;
         }
         lock (writeLock) {
             byte[] bts = Common.PackageHelper.GetByte(package);
             streamToClient.Write(bts, 0, bts.Length);
             LOGGER.InfoFormat("Send package {0} to host {1}.", package.ToString(),
                               clientNum == 0 ? tcpclient.Client.RemoteEndPoint.ToString() : clientNum.ToString());
             LOGGER.DebugFormat("Package: {0}", BitConverter.ToString(bts));
         }
     } catch (Exception e) {
         LOGGER.ErrorFormat("Error when send package to client:{0}, abort client.", this.ClientNum, e);
         requestThread.Abort();
     }
 }
        public static Common.Package Deal(RemoteClient client, Common.Package request, IHostServiceCallback callback)
        {
            switch (request.Cat)
            {
            case 0: {
                LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType).Error("Error receive NAK!");
                return(new Common.Ignored());
            }

            case 2: {
                Common.ClientLoginPackage loginRequest = request as Common.ClientLoginPackage;
                float cost;
                bool  loginOk = callback.Login(loginRequest.RoomNumber, loginRequest.IdNum, out cost);
                if (loginOk)
                {
                    client.ClientNum              = loginRequest.RoomNumber;
                    client.ClientStatus.Cost      = cost;
                    client.ClientStatus.Speed     = (int)ESpeed.NoWind;
                    client.ClientStatus.RealSpeed = (int)ESpeed.NoWind;
                    callback.AddClient(client);
                    var tmp = callback.GetDefaultWorkingState();
                    return(new Common.HostAckPackage(tmp.Item1, tmp.Item2));
                }
                else
                {
                    return(new Common.HostNakPackage());
                }
            }

            case 4: {
                Common.ClientTemperaturePackage clientTemperaturePackage = request as Common.ClientTemperaturePackage;
                client.ReceiveHeartBeat(clientTemperaturePackage.Temperature);
                return(new Common.Ignored());
            }

            case 5: {
                Common.ClientSpeedPackage clientSpeedPackage = request as Common.ClientSpeedPackage;
                client.ChangeSpeed(clientSpeedPackage.Speed);
                return(new Common.Ignored());
            }

            case 6: {
                Common.ClientStopPackage clientStopPackage = request as Common.ClientStopPackage;
                client.StopWind();
                return(new Common.Ignored());
            }

            case 9: {
                throw new IOException();
            }

            case 11: {
                Common.ClientTargetTemperaturePackage clientTargetTemperaturePackage = request as Common.ClientTargetTemperaturePackage;
                client.SetTargetTemperature(clientTargetTemperaturePackage.Temperature);
                return(new Common.Ignored());
            }

            default:
                throw new Exception("PackageHandler::Deal switch out of range with " + request.Cat);
            }
        }