WinForm TCP异步连接之服务器端
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异步连接之服务器端的更多相关文章
- Java TCP异步数据接收
之前一直采用.Net编写服务端程序,最近需要切换到Linux平台下,于是尝试采用Java编写数据服务器.TCP异步连接在C#中很容易实现,网上也有很多可供参考的代码.但Java异步TCP的参考资料较少 ...
- 基于C#的socket编程的TCP异步实现
一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...
- [C#]手把手教你打造Socket的TCP通讯连接(一)
本文章将讲解基于TCP连接的Socket通讯,使用Socket异步功能,并且无粘包现象,通过事件驱动使用. 在编写Socket代码之前,我们得要定义一下Socket的基本功能. 作为一个TCP连接,不 ...
- (转)基于C#的socket编程的TCP异步实现
一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...
- TCP/IP连接状态
1.建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1.(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN ...
- TCP 长连接与短连接的区别
TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...
- 一种C# TCP异步编程中遇到的问题
最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,G ...
- TCP的连接和建立 图解
前言 在没有理解TCP连接是如何建立和终止之前,我想你可能并不会使用connect,accept,close这三个函数并且使用netstat程序来调试应用.所以掌握TCP连接的建立和终止势在必行. 三 ...
- TCP长连接与短连接的原理及区别
一.当网络通信时采用TCP协议时: 1.过程: 第一步:(在真正的读写操作之前)Server 和Client 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...
随机推荐
- [原创]OpenERP 7.0 打印PDF报表 中文 乱码问题的解决方案。
网上的解决方案基本上以替换字体和安装上海先锋科技开发的软件包配置两种方案,替换字体的方案尝试了几次都么有成功,安装软件包的方案成功. 软件环境:Ubuntu Server 12.04 第一步:先到ht ...
- modbus学习
- mysql information_schema 数据库简介:
.CHARACTER_SETS 表 CREATE TEMPORARY TABLE `CHARACTER_SETS` ( `CHARACTER_SET_NAME` varchar() NOT NULL ...
- TCP超时重传、滑动窗口、拥塞控制、快重传和快恢复
TCP超时重传 原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 影响超时重传机制协议效率的一个关键参数是重传超时时 ...
- 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息
超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...
- 同学帮帮移动 H5 弹出层类组件:txbb-pop
Txbb.Pop 同学帮帮弹出层类组件,简洁.无依赖,使用 CSS3 实现动画效果. 为什么要再造一遍轮子 弹出层是常见的业务场景,而且弹出层的业务场景很简单,没必要使用大而全的库,并且,我们经常会有 ...
- 请写出5种常见到的runtime exception。
请写出5种常见到的runtime exception. 解答: NullPointerException:当操作一个空引用时会出现此错误. NumberFormatException:数据格式转换出现 ...
- .NET学习笔记(1)
把 DataSet 绑定到 Repeater 控件 Repeater 控件用于显示重复的项目列表,这些项目被限制在该控件.Repeater 控件可被绑定到数据库表.XML 文件或者其他项目列表. 获取 ...
- DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016错误解决方法
这个错误是:表处于"装入暂挂"状态. 经多次尝试 总结方法: 1:reorg table <表>: 假如不好使 则下面方法 2,先前尝试装入(LOAD)此表失败.表的状 ...
- Attribute在.net编程中的应用(一)
Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是一个非常重要的组成部分,为了帮助大家理解和掌握A ...