/// <summary> /// 接続する /// </summary> /// <returns></returns> private bool Connect(AbstractState state) { if (!IsOperatable) { return(false); } State = state; CRLFSocket socket = new CRLFSocket(); socket.ReadLine += new EventHandler <ReadLineEventArgs>(ProcessData); // FIXME: Closedに対する処理は未実装 ServerPoint server = serverPointList[random.Next(serverPointList.Count)]; return(socket.Connect(server.Host, server.Port)); }
/// <summary> /// データを処理します。 /// </summary> /// <param name="socket"></param> /// <param name="packet"></param> private void ProcessData(Object sender, ReadLineEventArgs e) { Logger.GetLog().Debug("現在の状態: " + State.GetType().Name); CRLFSocket socket = (CRLFSocket)sender; Packet packet = e.packet; string methodName = ClientConst.GetCodeName(packet.Code); Logger.GetLog().Debug("実行するメソッド: " + methodName); // HACK: こんなところでリフレクションを無駄に使うのはいかんでしょう。 Type type = State.GetType(); MethodInfo methodInfo = type.GetMethod(methodName); object[] args = { this, socket, packet }; methodInfo.Invoke(State, args); Logger.GetLog().Debug("実行後の状態: " + State.GetType().Name); State.Process(this, socket); }
// 634 Client->Server public virtual void ReplyProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet) { if (packet.Data == null || packet.Data.Length != 3) { return; } double version = 0.0; if (!double.TryParse(packet.Data[0], out version)) { return; } if (version < Const.ALLOW_PROTOCOL_VERSION) { socket.WriteLine("694 1 Protocol_version_incompatible"); socket.Close(); return; } socket.WriteLine("612 1"); }
public override void NoticeAllowVersion(IClientContextForState context, CRLFSocket socket, Packet packet) { string serverVersion = packet.Data[0]; // TODO: サーバのプロトコルバージョンチェックしてない if (processType == ClientConst.ProcessType.Join) { context.State = new RequireTemporaryPeerIdState(); } else if (processType == ClientConst.ProcessType.Maintain) { context.State = new PeerEchoState(); } else if (processType == ClientConst.ProcessType.Part) { context.State = new RequirePartState(); } else { throw new NotSupportedException(); } }
// 614 Server->Client public virtual void RequireProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet) { if (packet.Data == null || packet.Data.Length != 3) { return; } double version = 0.0; if (!double.TryParse(packet.Data[0], out version)) { return; } if (version < Const.ALLOW_PROTOCOL_VERSION) { socket.WriteLine("694 1 Protocol_version_incompatible"); socket.Close(); return; } string[] datas = { Const.PROTOCOL_VERSION, Const.SOFTWARE_NAME, Const.SOFTWARE_VERSION }; socket.WriteLine("634 1 " + string.Join(":", datas)); }
public override void IncorrectRequestError(IClientContextForState context, CRLFSocket socket, Packet packet) { context.State = new EndConnectionState(ClientConst.OperationResult.Restartable, ClientConst.ErrorCode.RETURNED_INVALID_REQUEST); }
public override void Process(IClientContextForState context, CRLFSocket socket) { socket.WriteLine("113 1"); }
/// <summary> /// 293 不正リクエストエラー /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void IncorrectRequestError(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new NotSupportedException(); }
public override void AddressChangedError(IClientContextForState context, CRLFSocket socket, Packet packet) { context.State = new EndConnectionState(ClientConst.OperationResult.Restartable, ClientConst.ErrorCode.RETURNED_ADDRESS_CHANGED); }
public virtual void ReplyPeerEcho(Manager.Peer peer, CRLFSocket socket, Packet packet) { // 何もしない。 }
public virtual void InvalidOperation(Manager.Peer peer, CRLFSocket socket, Packet packet) { socket.Close(); }
public override void Process(IClientContextForState context, CRLFSocket socket) { Logger.GetLog().Debug("...再接続中かな?"); // throw new NotSupportedException(); }
public override void NoticeAreaPeers(IClientContextForState context, CRLFSocket socket, Packet packet) { context.PeerState.AreaPeerDictionary = packet.Data[0].Split(';').ToDictionary(v => v.Split(',')[0], v => int.Parse(v.Split(',')[1])); context.State = new RequireProtocolTimeState(); }
/// <summary> /// 237 鍵の割り当て /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void AllocateKey(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new InvalidOperationException($"Cannot be operated in {GetType().Name}"); }
/// <summary> /// 238 プロトコル時刻 /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void ReceiveProtocolTime(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new InvalidOperationException($"Cannot be operated in {GetType().Name}"); }
/// <summary> /// 298 プロトコル仕様非準拠エラー /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void DifferentSpecificationError(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new InvalidOperationException($"Cannot be operated in {GetType().Name}"); }
/// <summary> /// 295 鍵割り当て不可エラー /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void KeyCantAllocateError(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new NotSupportedException(); }
/// <summary> /// 294 サーバ過負荷エラー /// </summary> /// <param name="context"></param> /// <param name="socket"></param> /// <param name="packet"></param> public virtual void ServerUnavailableError(IClientContextForState context, CRLFSocket socket, Packet packet) { throw new NotSupportedException(); }
public override void KeyCantAllocateError(IClientContextForState context, CRLFSocket socket, Packet packet) { ChangeState(context); }
public override void RequireAllowVersion(IClientContextForState context, CRLFSocket socket, Packet packet) { context.State = new NotifyProtocolVersionState(ProcessType); }
// 612 Server->Client public virtual void RequirePeerId(Manager.Peer peer, CRLFSocket socket, Packet packet) { socket.WriteLine("632 1 " + peer.GetParentPeerId()); }
public override void Process(IClientContextForState context, CRLFSocket socket) { string[] datas = { context.PeerState.PeerId.ToString(), context.PeerConfig.Port.ToString() }; socket.WriteLine("114 1 " + string.Join(":", datas)); }
public virtual void RequirePeerEcho(Manager.Peer peer, CRLFSocket socket, Packet packet) { socket.WriteLine("631 1"); }
public override void AllocatePeerId(IClientContextForState context, CRLFSocket socket, Packet packet) { // TODO: 鍵の取得は任意だが、必ず実施してしまっている context.State = new RequireAllocateKeyState(); }
public virtual void InvalidProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet) { socket.Close(); }
public override void AcceptedPart(IClientContextForState context, CRLFSocket socket, Packet packet) { context.State = new EndConnectionState(ClientConst.OperationResult.Successful, ClientConst.ErrorCode.SUCCESSFUL); }
public void SetUp() { crlfSocket = new CRLFSocket(); }
public abstract void Process(IClientContextForState context, CRLFSocket socket);
public override void ReceivePortCheckResult(IClientContextForState context, CRLFSocket socket, Packet packet) { context.PeerState.IsPortOpened = (packet.Data[0] == "1"); context.State = new RequirePeerDataState(General.ClientConst.ProcessType.Join); }
public void TearDown() { crlfSocket = null; }