完整的TCP通信包实现

来源:互联网 发布:js触发div的点击事件 编辑:程序博客网 时间:2024/04/28 19:19

using System;

namespace Jh.Sockets
{
   /// <summary>
   /// 线程状态信号定义
   /// </summary>
 public enum JhThreadStatus
 {
  Stop,    //停止
  Running,   //正在运行
  Exit    //已退出
 }
 /// <summary>
 /// 线程状态参数
 /// </summary>
 class Parm
 {
    public Parm(object obj):this(JhThreadStatus.Stop,obj)
    {
    }
    public Parm(JhThreadStatus nStatus,object obj)
    {
       Status = nStatus;
       ObjParm = obj;
    }
    JhThreadStatus status;
    object objParm;
    /// <summary>
    /// 上下文对象
    /// </summary>
    public object ObjParm
    {
       get{return objParm;}
       set{objParm = value;}
    }
    /// <summary>
    /// 控制状态
    /// </summary>
    public JhThreadStatus Status
    {
       get{return status;}
       set{status = value;}
    }
 }
 /// <summary>
 /// 通讯数据处理接口
 /// </summary>
 public interface  IObserver
 {
    //
    // 数据处理入口
    //
    void Deal(CommData cd);

    //
    // 数据处理重载方法.如果不希望后面的处理者继续处理数据,则返回true,否则返回false;
    //
    bool OnDeal(CommData cd);

    //
    // 附加的自身初始化操作
    //
    bool Init();

    //
    // 提前初始化接口
    //
    bool BeforeInit();

    //
    // 初始化后处理接口
    //
    bool AfterInit();

    //
    // 删除前处理接口
    //
    bool BeforeExit();

    //
    // 下一个观察者
    //
    IObserver Next
    {
       get;
       set;
    }

    //
    // 上一个观察者
    //
    IObserver Prev
    {
       get;
       set;
    }

    //
    // 添加观察者到后面,如果已经存在链表中则不做任何操作
    //
    void Add(IObserver observer);

    //
    // 插入观察者到下一个观察者的前面
    //
    void Insert(IObserver observer);
    //删除观察者
    void Remove(IObserver observer);
    //是否存在链表中
    bool IsExist(IObserver observer);
}
   /// <summary>
   /// 通讯数据处理类的基类,只能派生
   /// </summary>
 public abstract class  Observer : IObserver
{
   /// <summary>
   /// 数据处理入口.
   /// </summary>
   /// <param name="client">TcpClient类 实例</param>
   /// <param name="s">内存数据流</param>
   public void Deal(CommData cd)
   {
      cd.Data.Position = 0;
      if (OnDeal(cd) == false) return ;
      if (next != null)
      {
         next.Deal(cd);
      }
      return ;
    }

   /// <summary>
   /// 数据处理重载方法.
   /// </summary>
   /// <param name="client">TcpClient类 实例</param>
   /// <param name="s">内存数据流</param>
   /// <returns>处理结果,如果不希望后面的处理者继续处理数据,则返回false,否则返回true;</returns>
   public virtual bool OnDeal(CommData cd)
   {
      return true;
   }

    //附加的自身初始化操作
   public virtual bool Init()
   {
      return true;
   }
   //提前初始化接口
   public virtual bool BeforeInit()
   {
      return true;
   }
   //初始化后处理接口
   public virtual bool AfterInit()
   {
      return true;
   }
   //删除前处理接口
   public virtual bool BeforeExit()
   {
      return true;
   }
   //下一个观察者
   IObserver next = null;
   public IObserver Next
   {
      get{return next;}
      set{next = value;}
   }
   //上一个观察者
   IObserver prev = null;
   public IObserver Prev
   {
      get{return prev;}
      set{prev = value;}
   }
   //添加观察者
   public void Add(IObserver observer)
   {
      if (this == observer) return;//已经存在
      if (next == null)
      {
         next = observer;//达到最底端
         next.Prev = this;
      }
      else next.Add(observer);//加到后面
   }
   /// <summary>
   /// 插入观察者到下一个观察者的前面
   /// </summary>
   /// <param name="observer"></param>
   public void Insert(IObserver observer)
   {
      //是否等于自己
      if (this == observer) return;
      //先查找是否已经存在链表中
      if (Next != null && Next.IsExist(observer)) Next.Remove(observer);
      //
      observer.Next = Next;
      if (Next != null) Next.Prev = observer;
      Next = observer;
      observer.Prev = this;
   }
   /// <summary>
   /// 删除观察者
   /// </summary>
   /// <param name="observer"></param>
   public void Remove(IObserver observer)
   {
      if (observer == this)
      {
       if (Prev != null) Prev.Next = Next;
       if (Next != null) Next.Prev = Prev;
      }
      else
      {
       if (Next != null) Next.Remove(observer);
      }
   }
   /// <summary>
   /// 查找是否存在
   /// </summary>
   /// <param name="observer"></param>
   /// <returns></returns>
   public bool IsExist(IObserver observer)
   {
      if (observer == this) return true;
      if (Next == null) return false;
      else return Next.IsExist(observer);
   }
}

 /// <summary>
 /// 日志处理基类,本身从通讯数据处理类的基类派生。
 /// </summary>
 class   Log : Observer
 {
     public  Log()
     {
     }
     public Log(string slogfile)
     {
        LogFile = slogfile;
     }
     ~Log()
     {
     }
     // 日志文件带路径名称
     private string logFile;
     public string LogFile
     {
      get{return logFile;}
      set{logFile = value;}
     }
 }

}
using System;
using System.Collections;
using System.IO;
using System.Threading;

namespace Jh.Sockets
{
 /// <summary>
 /// 数据集中管理类
 /// </summary>
 public class CommDataMgr
 {
  static int index = 0;
  int id;
  /// <summary>
  /// 无参数构造方法
  /// </summary>
  public CommDataMgr()
  {
   id = index ++;
   dnFlag = new Parm(this);
   Console.WriteLine("JH data distributor {0} constructed",id);
  }
  Thread t = null;
  public void Start()
  {
   if (dnFlag.Status != JhThreadStatus.Running)
   {
    dnFlag.Status = JhThreadStatus.Running;
    t = new Thread (new ThreadStart(DataNotiyfyThread));
    t.Name = "JH data distributing  " + id.ToString();
    t.Start();
    Console.WriteLine("JH data distributing thread of JH data distributor {0} started",id);
   }
  }
  public void Stop()
  {  
   if ( dnFlag.Status == JhThreadStatus.Running )
   {
    lock (this)
    {
     dnFlag.Status = JhThreadStatus.Stop;
    }
   }

  }
  /// <summary>
  /// 析构方法
  /// </summary>
  ~CommDataMgr()
  {
   Stop();
   Console.WriteLine("JH data distributor {0} unconstructed",id);
  }
  public void DataNotiyfyThread()
  {
   try
   {
    while (dnFlag.Status == JhThreadStatus.Running)
    {
     DealData();
     Thread.Sleep(100);
//     Console.WriteLine("分发线程{0}工作中",id);
    }
   }
   catch(Exception e)
   {
    Console.WriteLine(e.Message);
   }
   finally
   {
    lock(this)
    {
     dnFlag.Status = JhThreadStatus.Exit;
    }
    Console.WriteLine("JH data distributing thread of JH data distributor {0} exited",id);
   }
  }
  Parm dnFlag = null;
  ArrayList aData = new ArrayList();
  InnerObserver root = new InnerObserver();
  /// <summary>
  /// 观察者根节点类 定义
  /// </summary>
  internal class InnerObserver : Observer
  {
  }
  public void DealData()
  {
   if (DataCount > 0)
   {
    lock(this)
    {
     if (root.Next != null)
     {
      root.Next.Deal((CommData)aData[0]);
     }
     RemoveAt(0);
    }
   }
  }
  /// <summary>
  /// 未处理数据个数
  /// </summary>
  public int DataCount
  {
   get
   {
    return aData.Count;
   }
  }
  /// <summary>
  /// 根据索引返回未处理数据
  /// </summary>
  internal CommData this[int Index]
  {
   get
   {
    return (CommData)aData[Index];
   }
  }
  /// <summary>
  /// 根据索引删除数据
  /// </summary>
  /// <param name="Index">索引</param>
  public void RemoveAt(int Index)
  {
   if (Index >= 0 && Index < DataCount)
   {
    lock (this)
    {
     aData.RemoveAt(Index);
    }
   }
  }
  /// <summary>
  /// 接收到新的数据提交
  /// </summary>
  /// <param name="client">客户端连接</param>
  /// <param name="s">数据流</param>
  public void AddData(JhClient client,MemoryStream s,int len)
  {
   CommData cd = new CommData(client,s,len,this);
   lock(this)
   {
    aData.Add(cd);
   }
  }
  /// <summary>
  /// 添加观察者
  /// </summary>
  /// <param name="observer"></param>
  public void Add(IObserver observer)
  {
   lock (this)
   {
    root.Add(observer);
   }
  }
  /// <summary>
  /// 删除观察者
  /// </summary>
  /// <param name="observer"></param>
  public void Remove(IObserver observer)
  {
   lock (this)
   {
    root.Remove(observer);
   }
  }
  /// <summary>
  /// 在最前面插入观察者
  /// </summary>
  /// <param name="observer"></param>
  public void Insert(IObserver observer)
  {
   lock (this)
   {
    root.Insert(observer);
   }
  }
  // 取观察者个数
  //  int GetObserverCount()
  //  {
  //   return (int)m_aObservers.GetCount();
  //  }

 }

原创粉丝点击