博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# — WinForm TCP连接之服务器端
阅读量:4597 次
发布时间:2019-06-09

本文共 3616 字,大约阅读时间需要 12 分钟。

TCP连接之服务器端,涉及到如下三个函数,分别是:

/*****************************  ** 函数功能:     服务端监听  ** 输入参数:      ** 输出参数: ******************************/ private void ServerListen(){}

 

/****************************** ** 函数功能:    用于与客户端取得连接 ** 输入参数:  ** 输出参数: ******************************/ private void AcceptConnect(){}

 

/****************************** ** 函数功能:    接受客户端发回的信息 ** 输入参数:      ar:客户端发回的信息 ** 输出参数: ******************************/ private void ReadCallback(IasyncResult ar){}

 

三者的关系图如下:

 

具体代码如下:

1、ServerListen()

View Code
private bool isExit = false; TcpListener listener;  //用于线程同步,初始状态设为非终止状态,使用手动重置方式 private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);  /******************************   ** 作者: ***   ** 变更时间: 2012-12-26  ******************************/  #region 服务端监听方法  private void ServerListen()  {      //由于服务器要为多个客户服务,所以需要创建一个线程监听客户端连接请求     ThreadStart ts = new ThreadStart(AcceptConnect);      Thread myThread = new Thread(ts);      myThread.Start();  } #endregion

 

2、AcceptConnect()

View Code
/******************************   ** 作者: ***  ** 变更时间: 2012-12-26 ******************************/ #region 与客户机取得连接 private void AcceptConnect() {      //获取本机所有IP地址      IPAddress[] localips = Dns.GetHostAddresses(Dns.GetHostName());          foreach (IPAddress ip in localips)      {          //找到本地所有IP地址符合IPV4协议的IP地址        if (ip.AddressFamily == AddressFamily.InterNetwork)          {                IPAddress ip4;                ip4 = ip;                listener = new TcpListener(ip4, 5000);                listener.Start();                break;           }       }       //引用在异步操作完成时调用的回调方法     AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);       while (isExit == false)       {           //将事件的状态设为非终止         allDone.Reset();           //开始一个异步操作接受传入的连接尝试         listener.BeginAcceptTcpClient(callback, listener);           //阻塞当前线程,直到收到客户连接信号         allDone.WaitOne();            Thread.Sleep(100);        } } #endregion

 

3、AcceptTcpClientCallback()

View Code
/******************************   ** 作者: ***  ** 变更时间: 2012-12-26 ******************************/ #region 连接客户端的回调函数 //ar是IAsyncResult类型的接口,表示异步操作的状态是由listener.BeginAcceptTcpClient(callback, listener)传递过来的   private void AcceptTcpClientCallback(IAsyncResult ar)  {      //将事件状态设为终止状态,允许一个或多个等待线程继续     allDone.Set();      TcpListener myListener = (TcpListener)ar.AsyncState;      //异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信     TcpClient client = myListener.EndAcceptTcpClient(ar);      ReadWriteObject readWriteObject = new ReadWriteObject(client);      readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);   } #endregion

 

4、ReadCallback()

View Code
byte[] tem = new byte[24];  byte[] Msgbody;  byte[] ErrorEndTime;  ByteToObject bytetoobject = new ByteToObject();  /******************************   ** 作者: ***   ** 变更时间: 2012-12-02  ******************************/  #region 接收客户端发来的信息,ar为异步方法下客户端发回的信息  private void ReadCallback(IAsyncResult ar)  {        ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;        int length = readWriteObject.netStream.EndRead(ar);        tem = new byte[24];        Array.Copy(readWriteObject.readBytes, 0, tem, 0, 24);        //MsgHead为自定义的结构体        MsgHead msghead = (MsgHead)bytetoobject.BytesToStuct(tem, typeof(MsgHead));       if (length > 0 && msghead.Sync == 0x4D)       {           switch (msghead.MsgType)           {                //根据收到的信息的头部来执行下面的操作           }       }            }

 

 

 

转载于:https://www.cnblogs.com/guolebin7/archive/2013/04/08/3006715.html

你可能感兴趣的文章
PBKDF2加密的实现
查看>>
微信企业号OAuth2验证接口实例(使用SpringMVC)
查看>>
python命名规范
查看>>
Codeforces Round #420 A
查看>>
activity的隐式和显式启动
查看>>
Amazing Websites
查看>>
架构属性(转载)
查看>>
Vue组件库的那些事儿,你都知道吗?
查看>>
base64格式的图片如何上传到oss
查看>>
javascript的DOM操作及实例
查看>>
html5
查看>>
ubuntu 上用virtualenv安装python不同版本的开发环境。
查看>>
链式队列
查看>>
mapreduce 多种输入
查看>>
从JDBC到commons-dbutils
查看>>
数据访问:Implementing Efficient Transactions
查看>>
csapp读书笔记
查看>>
Android 框架揭秘 --读书笔记
查看>>
对于Dubbo一些面试题自己的答案
查看>>
In Place Algorithm
查看>>