private void _BeginSend() { if (this._sendingFlag) {//正在发送则无需处理,等本次发送完毕,会自行进行下次数据发送 return; } this._sendingFlag = true; long curMili = Utils.CurrentTimeMillis(); _socket.BeginSend(_sendStream.Oct.Datas, _sendStream.Position, _sendStream.RemainCount, SocketFlags.None, iar => _actions.Enqueue(() => { int length = 0; try { length = _socket.EndSend(iar); //TestArray.Add(Utils.CurrentTimeMillis() - curMili); } catch (Exception) { ExcetpionHappen(); return; } _sendStream.ReCalculatePosition(length); this._sendingFlag = false; if (_sendStream.Oct.Count > 0) { _BeginSend(); } }), null); }
public void Tick(object args) { lock (_receiveTransitStream) { if (_receiveTransitStream.RemainCount > 0) { SerializeControl.Instance.Deserialize(_receiveTransitStream, _protocols); if (_receiveTransitStream.Position != 0) { _receiveTransitStream.ReCalculatePosition(0); } } } while (_protocols.Count > 0) { IProtocol p = _protocols.Dequeue(); p.Process(this, args); } Action action; if (_actions.TryDequeue(out action)) { action(); } else { //break; } }
void Send(object socketObj) { //不直接访问主线程的_socket字段,因为Close的时候会清空该字段,虽然同时会停止发送线程,安全起见,线程内部保存了一个对象 //接收同理 Socket socket = socketObj as Socket; while (true) { _sendEvent.WaitOne(); lock (_sendTransitOct) { _sendBuffer.Oct.Write(_sendTransitOct); _sendTransitOct.Clear(); } SocketError error; int saveFlag = 0; while (_sendBuffer.RemainCount > 0) { if (saveFlag++ > 100) { //throw new Exception("Send loop is over 100 times!"); //关闭Link Close(NetExceptionType.Send, new Exception("Maybe send thread is dead loop")); return; } int sendCount = 0; try { sendCount = socket.Send(_sendBuffer.Oct.Datas, _sendBuffer.Position, _sendBuffer.RemainCount, SocketFlags.None, out error); } catch (Exception e) { Close(NetExceptionType.Send, e); return; } _sendBuffer.ReCalculatePosition(sendCount); } } }
public void StartRecieve() { try { _socket.BeginReceive(_input, 0, _inputSize, SocketFlags.None, iar => _actions.Enqueue(() => {//添加到_actions列表保证在主线程对ReceiveStream执行添加操作 int length = 0; try { length = _socket.EndReceive(iar); } catch (Exception ex) { ExceptionClose(NetExceptionType.Receive, ex); return; } _receiveStream.Oct.Write(_input, 0, length); try { SerializeControl.Instance.Deserialize(_receiveStream, _protocols); } catch (Exception ex) { ExceptionClose(NetExceptionType.Deserialize, ex); return; } if (_receiveStream.Position != 0) { _receiveStream.ReCalculatePosition(0); } StartRecieve(); }), null); } catch (Exception ex) { ExceptionClose(NetExceptionType.Receive, ex); } }