public Network(IHostServiceCallback callback) { this.callback = callback; state = 0; LOGGER = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); LOGGER.Info("Network init!"); listener = new TcpListener(IPAddress.Parse("0.0.0.0"), Common.Constants.PORT); }
public void ChangeMode(IHostServiceCallback cb) { var tmp = cb.GetDefaultWorkingState(); Common.HostModePackage hostModePackage = new Common.HostModePackage(tmp.Item1, tmp.Item2); SendPackage(hostModePackage); this.ClientStatus.Speed = this.ClientStatus.RealSpeed = (int)ESpeed.NoWind; LOGGER.InfoFormat("Host change mode package send mode:{0}, temperature:{1}!", tmp.Item1, tmp.Item2); }
public RemoteClient(TcpClient client, IHostServiceCallback callback) { this.tcpclient = client; LOGGER.InfoFormat("Client Connected! {0} < -- {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint); streamToClient = client.GetStream(); clientStatus = new ClientStatus(); this.callback = callback; heartBeatTimer = new System.Timers.Timer(5000); heartBeatTimer.AutoReset = true; heartBeatTimer.Elapsed += this.heartBeat; requestThread = new System.Threading.Thread(run); requestThread.Start(callback); }
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); } }
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); } }