Exemple #1
0
 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);
                }
            }
        }
Exemple #4
0
        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
            });
        }
Exemple #5
0
        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)
            {
                // 子プロセスが終了すると例外を吐く
            }
        }
Exemple #6
0
        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;
                    }
                }
            }
        }
Exemple #7
0
 private static T Copy <T>(T obj)
 {
     return((T)RPCTypes.Deserialize(typeof(T), RPCTypes.Serialize(typeof(T), obj)));
 }