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

/*****************************
** 函数功能:
服务端监听
** 输入参数:
** 输出参数:
******************************/
private void ServerListen(){}
/******************************
** 函数功能:
用于与客户端取得连接
** 输入参数:
** 输出参数:
******************************/
private void AcceptConnect(){}
/******************************
** 函数功能:
接受客户端发回的信息
** 输入参数:
ar:客户端发回的信息
** 输出参数:
******************************/
private void ReadCallback(IasyncResult ar){}

三者的关系图如下:

具体代码如下:

1、ServerListen()

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()

/******************************
** 作者: ***
** 变更时间: 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()

/******************************
** 作者: ***
** 变更时间: 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()

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)
{
//根据收到的信息的头部来执行下面的操作
}
}
}

  

WinForm TCP异步连接之服务器端的更多相关文章

  1. Java TCP异步数据接收

    之前一直采用.Net编写服务端程序,最近需要切换到Linux平台下,于是尝试采用Java编写数据服务器.TCP异步连接在C#中很容易实现,网上也有很多可供参考的代码.但Java异步TCP的参考资料较少 ...

  2. 基于C#的socket编程的TCP异步实现

    一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...

  3. [C#]手把手教你打造Socket的TCP通讯连接(一)

    本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ...

  4. (转)基于C#的socket编程的TCP异步实现

    一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...

  5. TCP/IP连接状态

    1.建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1.(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN ...

  6. TCP 长连接与短连接的区别

    TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...

  7. 一种C# TCP异步编程中遇到的问题

    最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,G ...

  8. TCP的连接和建立 图解

    前言 在没有理解TCP连接是如何建立和终止之前,我想你可能并不会使用connect,accept,close这三个函数并且使用netstat程序来调试应用.所以掌握TCP连接的建立和终止势在必行. 三 ...

  9. TCP长连接与短连接的原理及区别

    一.当网络通信时采用TCP协议时:  1.过程: 第一步:(在真正的读写操作之前)Server 和Client 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...

随机推荐

  1. TCP/IP各层协议数据格式

    ISO规范里定义了7层网络模型,实际常用的仍为TCPIP四层网络模型. 注:本文章插图均来自<图解TCP/IP>. 数据链路层帧格式 经常说的帧格式为以太网帧格式,由于类型和帧长度字段不重 ...

  2. impala+hdfs+parquet格式文件

    [创建目录]hdfs dfs -mkdir -p /user/hdfs/sample_data/parquet [赋予权限]sudo -u hdfs hadoop fs -chown -R impal ...

  3. Matlab之显示输出

    0.recommand: fprintf fprintf('%d\n', i); 1.disp disp(['answer = '  num2str(5)]); 2.sprintf sprintf(' ...

  4. 第二百一十八节,jQuery EasyUI,TimeSpinner(时间微调)组件

    jQuery EasyUI,TimeSpinner(时间微调)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 TimeSpinner(时间微 ...

  5. 关于pom.xml中的MAVEN出错处理

    原因:maven与pom的版本不一致 解决方法: 1.升级maven 插件: help--install..... 2.根据出错的信息,找到没有下载成功的本地仓库目录 ,将目录下的文件删除,再在项目上 ...

  6. leetcode-happy number implemented in python

    视频分析: http://v.youku.com/v_show/id_XMTMyODkyNDA0MA==.html?from=y1.7-1.2 class Solution(object): def ...

  7. cmake实战第二篇:让我们的代码更像个工程

    为工程添加以下文件夹:    bin 用来放编译好的可执行二进制文件. src 用来放源代码. lib 用来放编译好的库文件. include 用来放头文件. sudo mkdir -p /code_ ...

  8. 74、shape 画圆 加 边框

    <?xml version="1.0" encoding="utf-8"?> <!--<shape xmlns:android=&quo ...

  9. java was started but returned exit code=1

    将eclipse.ini文件删掉, 重启eclipse 会自动生成一个eclipse.ini就可以了~

  10. 【BZOJ3714】[PA2014]Kuglarz 最小生成树

    [BZOJ3714][PA2014]Kuglarz Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获 ...