private async Task Send(RPCMethodId id, object obj) { if (client != null) { byte[] bytes = RPCTypes.Serialize(id, obj); await client.GetStream().WriteAsync(bytes, 0, bytes.Length); } }
public async Task Start() { try { while (true) { var rpc = await RPCTypes.Deserialize(stream); manager.OnRequestReceived(this, rpc.id, rpc.arg); TotalRecvCount++; } } catch (Exception) { Util.AddLog("クライアント(" + HostName + ":" + Port + ")との接続が切れました", null); Close(); } manager.OnClientClosed(this); }
private async Task Send(RPCMethodId id, object obj) { byte[] bytes = RPCTypes.Serialize(id, obj); foreach (var client in ClientList.ToArray()) { try { await client.GetStream().WriteAsync(bytes, 0, bytes.Length); client.TotalSendCount++; } catch (Exception) { Util.AddLog("クライアント(" + client.HostName + ":" + client.Port + ")との接続が切れました", null); client.Close(); OnClientClosed(client); } } }
public static async Task <RPCInfo> Deserialize(NetworkStream ns) { var headerbytes = await ReadBytes(ns, HEADER_SIZE); var id = (RPCMethodId)BitConverter.ToInt16(headerbytes, 0); var csize = BitConverter.ToInt32(headerbytes, 2); object arg = null; if (csize > 0) { var data = await RPCTypes.ReadBytes(ns, csize); //Debug.Print("Received: " + System.Text.Encoding.UTF8.GetString(data)); var argType = RPCTypes.ArgumentTypes[id]; var s = new DataContractSerializer(argType); var ms = new MemoryStream(data); arg = s.ReadObject(ms); } return(new RPCInfo() { id = id, arg = arg }); }
private async Task RunCommandHost() { try { // 子プロセスが終了するまでループ while (true) { var rpc = await RPCTypes.Deserialize(pipes.ReadPipe); string ret = ""; try { switch (rpc.id) { case RPCMethodId.AddTag: var tag = (string)rpc.arg; if (!string.IsNullOrEmpty(tag) && !Item.Tags.Contains(tag)) { Item.Tags.Add(tag); } ret = string.Join(";", Item.Tags); break; case RPCMethodId.SetOutDir: if (Phase == ScriptPhase.PostEncode) { ret = "エンコードが完了したアイテムの出力先は変更できません"; } else if (string.IsNullOrEmpty(rpc.arg as string)) { ret = "出力先を指定してください"; } else { var outdir = (rpc.arg as string).TrimEnd(Path.DirectorySeparatorChar); Item.DstPath = outdir + "\\" + Path.GetFileName(Item.DstPath); ret = "成功"; } break; case RPCMethodId.SetPriority: if (Phase != ScriptPhase.OnAdd) { ret = "追加時以外の優先度操作はできません"; } else { int priority; if (!int.TryParse(rpc.arg as string, out priority) || priority < 1 || priority > 5) { ret = "優先度が範囲外です"; } else { Item.Priority = priority; ret = "成功"; } } break; case RPCMethodId.GetOutFiles: if (Phase != ScriptPhase.PostEncode) { ret = "実行後ではないため、出力ファイルを取得できません"; } else { ret = GetOutFiles((string)rpc.arg); } break; case RPCMethodId.CancelItem: if (Phase == ScriptPhase.PostEncode) { ret = "エンコードが完了したアイテムはキャンセルできません"; } else { Item.State = QueueState.Canceled; ret = "成功"; } break; } } catch (Exception e) { ret = e.Message; } var bytes = RPCTypes.Serialize(rpc.id, ret); await pipes.WritePipe.WriteAsync(bytes, 0, bytes.Length); } } catch (Exception) { // 子プロセスが終了すると例外を吐く } }
public async Task Start() { string failReason = ""; int failCount = 0; int nextWaitSec = 0; while (true) { try { if (nextWaitSec > 0) { await Task.Delay(nextWaitSec * 1000); nextWaitSec = 0; } if (serverIp == null) { // 未初期化 await askServerAddress("アドレスを入力してください"); if (finished) { break; } await Connect(); } if (client == null) { // 再接続 if (reconnect == false) { await askServerAddress(failReason); } if (finished) { break; } reconnect = false; await Connect(); } var rpc = await RPCTypes.Deserialize(stream); OnRequestReceived(rpc.id, rpc.arg); failCount = 0; } catch (Exception e) { // 失敗したら一旦閉じる Close(); if (finished) { break; } if (reconnect == false) { nextWaitSec = failCount * 10; Util.AddLog("接続エラー: ", e); Util.AddLog(nextWaitSec.ToString() + "秒後にリトライします", null); failReason = e.Message; ++failCount; } } } }
private static T Copy <T>(T obj) { return((T)RPCTypes.Deserialize(typeof(T), RPCTypes.Serialize(typeof(T), obj))); }