private void ProResourceRequest(ResourceRequestMessage message) { TransferSender sender; if (this._senderDic.TryGetValue(message.Header.Rid, out sender)) { sender.ProResourceRequest(message); } else { //Loger.Warn($"未知的资源ID:{message.Header.Rid}"); } }
private void PrimitiveReqData(TransferReqDataSchduleInfoManager reqDataSchduleInfoManager, TransferReqDataSchduleInfo currentReqDataSchduleInfo) { var endPoint = reqDataSchduleInfoManager.NotifyMessage.SrcEndPoint; int repeatCount = 0; int mtu, rto; while (repeatCount++ < this._config.MtuRepeatMaxCount) { mtu = TransferParaManager.GetMtu(endPoint); rto = TransferParaManager.GetRto(endPoint); var ep = currentReqDataSchduleInfo.EndPostion - currentReqDataSchduleInfo.Postion; if (mtu > ep) { mtu = (int)ep; } if (mtu <= 0) { break; } var reqMessage = new ResourceRequestMessage(reqDataSchduleInfoManager.NotifyMessage.Header.Rid, currentReqDataSchduleInfo.Postion, mtu); var buffer = reqMessage.GenerateBuffer(); var eventHandleId = reqMessage.ContextId; var eventHandleInfo = AutoEventWaitHandleManager.CreateEventWaitHandle(eventHandleId, reqDataSchduleInfoManager.NotifyMessage.Timeout); try { //_ht[$"{reqMessage.Header.Rid}_{reqMessage.ContextId}"] = _watch.ElapsedMilliseconds; this._net.Send(buffer, endPoint); if (eventHandleInfo.EventWaitHandle.WaitOne(rto)) { currentReqDataSchduleInfo.UpdatePostion(mtu); if (currentReqDataSchduleInfo.IsTransferCompleted()) { //Loger.Warn($"线程[{System.Threading.Thread.CurrentThread.Name}]传输[Rid:{reqDataSchduleInfoManager.NotifyMessage.Header.Rid}],[{currentReqDataSchduleInfo.BeginPostion}-{currentReqDataSchduleInfo.EndPostion}]完成"); } } else { TransferParaManager.RecordMtuAndRto(endPoint, mtu, rto, true); mtu = TransferParaManager.AdjustDownMtu(endPoint); rto = TransferParaManager.AdjustUpRto(endPoint); } } finally { AutoEventWaitHandleManager.RemoveEventWaitHandle(eventHandleId); eventHandleInfo.EventWaitHandle.Dispose(); } } }
/// <summary> /// 创建 /// </summary> /// <param name="req"></param> /// <param name="data"></param> public ResourceResponseMessage(ResourceRequestMessage req, byte[] data) : base(new CommonHeader(TransferCommands.ResourceResponse, req.Header.Timestamp, req.Header.Rid)) { this.ContextId = req.ContextId; this.Position = req.Position; if (data != null) { this.Size = data.Length; } else { this.Size = RESOURCE_NOT_EXIST; } this._data = data; }
internal void ProResourceRequest(ResourceRequestMessage req) { try { this._resoucesInfo.UpdateLastAccessTimestamp(); if (req.Size <= 0) { Loger.Warn($"[RID:{req.Header.Rid}]请求数据长度值:{req.Size}无效,忽略"); return; } //Loger.Trace($"收到请求RID:{message.Rid},ContextId:{message.ContextId},Position:{message.Position}-Size:{message.Size}"); byte[] data = this.GetRequestData(req); var res = new ResourceResponseMessage(req, data); byte[] buffer = res.GenerateBuffer(); this._net.Send(buffer, this._resoucesInfo.Policy.RemoteEP); //Loger.Trace($"响应请求RID:{req.Rid},ContextId:{req.ContextId},Position:{req.Position}-Size:{req.Size}"); } catch (Exception ex) { Loger.Error(ex, "处理资源请求异常"); } }
private byte[] GetRequestData(ResourceRequestMessage req) { //Loger.Trace($"收到请求RID:{message.Rid},ContextId:{message.ContextId},Position:{message.Position}-Size:{message.Size}"); byte[] data = null; const int timeout = 10; var resoucesType = this._resoucesInfo.ResoucesType; while (!this._isDisposabled) { try { switch (resoucesType) { case TransferDataType.Data: case TransferDataType.File: Stream stream = null; data = new byte[req.Size]; try { if (!this._streams.TryTake(out stream, timeout, this._cts.Token)) { lock (this._isDisposabledLock) { if (this._isDisposabled) { return(null); } if (resoucesType == TransferDataType.Data) { stream = new MemoryStream(this._resoucesInfo.Data); } else if (resoucesType == TransferDataType.File) { stream = new FileStream(this._resoucesInfo.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); } else { throw new NotImplementedException($"未实现的发送模式[{resoucesType.ToString()}]"); } this._streamList.Add(stream); } } if (stream == null) { continue; } stream.Seek(req.Position, SeekOrigin.Begin); stream.Read(data, 0, data.Length); } catch (ObjectDisposedException) { } finally { if (stream != null) { try { this._streams.Add(stream); } catch (ObjectDisposedException) { } } } break; case TransferDataType.Stream: data = this._resoucesInfo.GetStreamData(req.Position, req.Size); break; default: throw new NotImplementedException($"未实现的资源类型:{this._resoucesInfo.ResoucesType.ToString()}"); } break; } catch (ArgumentNullException) { //.net BUG continue; } catch (OperationCanceledException) { data = null; break; } catch (Exception ex) { Loger.Error(ex); data = null; break; } } return(data); }