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