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 之间必须建立一个连接,连接的建立需要三次握手 经典的三次握手示意图: 第二步:进行读写操 ...
随机推荐
- 【转】【Mac + Git】之Git pull 强制拉取并覆盖本地代码
Git pull 强制拉取并覆盖本地代码 git fetch --all git reset --hard origin/master git pull 参考文章: <Git pull 强制拉取 ...
- Papers of Word Embeddings
首先解释一下什么叫做embedding.举个例子:地图就是对于现实地理的embedding,现实的地理地形的信息其实远远超过三维 但是地图通过颜色和等高线等来最大化表现现实的地理信息. embeddi ...
- 目标跟踪之卡尔曼滤波---理解Kalman滤波的使用预测
Kalman滤波简介 Kalman滤波是一种线性滤波与预测方法,原文为:A New Approach to Linear Filtering and Prediction Problems.文章推导很 ...
- 正确的关机方法: sync, shutdown, reboot, halt, poweroff, init
正常情况下,要关机时需要注意底下几件事: 观察系统的使用状态: 如果要看目前有谁在在线,可以下达『who』这个命令,而如果要看网络的联机状态,可以下达 『 netstat -a 』这个命令, 而要看背 ...
- C# Expression 树转化为SQL语句(一)
sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...
- cout顺序,i++和++i
先看下以下代码 #include<iostream> using namespace std; ; int f1() { x = ; return x; } int f2() { x = ...
- Docker for window 无法共享磁盘
Docker for window 无法共享主机磁盘,环境如下: 操作系统: windown10 Docker version 18.09.0, build 4d60db4 症状如下: 如图,点击ap ...
- 第十三篇:multimap容器和multiset容器中的find操作
前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...
- sql 循环表中记录
=========================================================================循环排序查询数据=================== ...
- LeetCode-Integer Breaks
Given a positive integer n, break it into the sum of at least two positive integers and maximize the ...