《WinForm开发系列之高级篇》Item2 TCP异步传输

1.AsySocket.cs

 

ContractedBlock.gifExpandedBlockStart.gif代码
public class AsySocket
{
#region 私有字段

private Socket mSocket = null;
private string mID = "";


#endregion

#region 构造函数
public AsySocket(string _LocalIP, int _LocalPort)
{
try
{
mSocket
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipe
= new IPEndPoint(System.Net.IPAddress.Parse(_LocalIP), _LocalPort);
mID
= Guid.NewGuid().ToString();
mSocket.Bind(ipe);
}
catch (Exception e)
{
//初始化Socket错误
}
}

public AsySocket(Socket linkObject)
{
IPEndPoint iep
= (IPEndPoint)linkObject.RemoteEndPoint;

mSocket
= linkObject;
mID
= Guid.NewGuid().ToString();
}

//public void Stop()
//{
// if (mSocket != null)
// {
// mSocket.Close();
// }
//}
#endregion

#region 公共事件
/// <summary>
/// 是否运行
/// </summary>
public bool IsRun = false;
/// <summary>
/// 发送的数据
/// </summary>
public byte[] SendData;

public event AcceptEventHandler onAccept = null;
public event AsySocketClosedEventHandler onClosed = null;
public event StreamDataAcceptHandler onStreamDataAccept = null;
public event StringDataAcceptHandler onStringDataAccept = null;
public event AsySocketEventHandler onSended = null;
public event AsySocketEventHandler onSendTo = null;


/// <summary>
/// 客户端连接建立委托
/// </summary>
/// <param name="AcceptedSocket"></param>
public delegate void AcceptEventHandler(AsySocket AcceptedSocket);
/// <summary>
/// 客户端连接关闭委托
/// </summary>
/// <param name="SocketID"></param>
/// <param name="ErrorMessage"></param>
public delegate void AsySocketClosedEventHandler(AsySocket AcceptedSocket, string ErrorMessage);
/// <summary>
/// 收到数据流委托
/// </summary>
/// <param name="AccepterID"></param>
/// <param name="AcceptData"></param>
public delegate void StreamDataAcceptHandler(AsySocket asySocket, byte[] AcceptData);
/// <summary>
/// Socket事件委托
/// </summary>
/// <param name="SenderID"></param>
/// <param name="EventMessage"></param>
public delegate void AsySocketEventHandler(AsySocket asySocket, string EventMessage);

public delegate void StringDataAcceptHandler(AsySocket asySocket, string AcceptData);

#endregion

#region 公共方法
/// <summary>
/// 监听
/// </summary>
public void Listen(int maxClients)
{
try
{
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
mSocket.Listen(maxClients);
mSocket.BeginAccept(
new AsyncCallback(AcceptCallBack), null);//异步

IsRun
= true;
}
catch {
IsRun
= false;
}
}

/// <summary>
/// 发送二进制数据
/// </summary>
/// <param name="SendData"></param>
public void ASend(byte[] sendData)
{

SendData
= sendData;
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
if (SendData == null)
return;

//添加的内容
try
{
mSocket.BeginSend(SendData,
0, SendData.Length, 0, new AsyncCallback(SendCallBack), mSocket);

}
catch
{ }
//sendDone.WaitOne();
}

/// <summary>
/// 发送文本数据
/// </summary>
/// <param name="SendData"></param>
public void ASend(string sendData)
{
SendData
= UTF8Encoding.UTF8.GetBytes(sendData);
if (SendData.Length == 0)
return;
this.ASend(UTF8Encoding.UTF8.GetBytes(sendData));

//if (sendData.Length == 0)
// return;
//this.ASend(sendData);
}

/// <summary>
/// UDP发送二进制数据
/// </summary>
/// <param name="SendData"></param>
/// <param name="EndPoint">目标端点</param>
public void ASendTo(byte[] sendData, IPEndPoint EndPoint)
{
if (mSocket == null)
throw new ArgumentNullException("连接不存在");
if (SendData == null)
return;
SendData
= sendData;
mSocket.BeginSendTo(SendData,
0, SendData.Length, 0, EndPoint, new AsyncCallback(SendToCallBack), null);
//sendToDone.WaitOne();
}
/// <summary>
/// UDP发送文本数据
/// </summary>
/// <param name="SendData"></param>
/// <param name="EndPoint"></param>
public void ASendTo(string sendData, IPEndPoint EndPoint)
{
if (SendData.Length == 0)
return;
SendData
= UTF8Encoding.UTF8.GetBytes(sendData);
ASendTo(UTF8Encoding.UTF8.GetBytes(sendData), EndPoint);
}

/// <summary>
/// 开始接受数据
/// </summary>
public void BeginAcceptData()
{
if (mSocket == null)
throw new ArgumentNullException("连接对象为空");
//开始接收数据
StateObject state = new StateObject();
state.workSocket
= mSocket;
mSocket.BeginReceive(state.buffer,
0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
//receiveDone.WaitOne();
}

#endregion

#region 公共属性

public class StateObject
{
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}

/// <summary>
/// 消息的中止判断符
/// </summary>
public static string EndChar
{
get
{
return new string((char)0, 1);
}
}
public string ID
{
get
{
return mID;
}
}
/// <summary>
/// 发送、接受数据的结尾标志
/// </summary>
public static char LastSign
{
get
{
return (char)0;
}
}
/// <summary>
/// 获取、设置连接对象
/// </summary>
public Socket LinkObject
{
get
{
return mSocket;
}
set
{
mSocket
= value;
}
}

public string Address
{
get {
IPEndPoint ep
=(IPEndPoint)LinkObject.RemoteEndPoint;
return ep.Address.ToString();
}
}

public int Port
{
get
{
IPEndPoint ep
= (IPEndPoint)LinkObject.RemoteEndPoint;
return ep.Port;
}
}

public IPEndPoint EndPoint
{
get
{
IPEndPoint ep
= (IPEndPoint)LinkObject.RemoteEndPoint;
return ep;
}
}
#endregion

#region 私有方法


/// <summary>
/// 连接建立处理
/// </summary>
/// <param name="ar"></param>
private void AcceptCallBack(IAsyncResult ar)
{
Socket handler
= mSocket.EndAccept(ar);
AsySocket NewSocket
= new AsySocket(handler);
//激发事件
if (onAccept != null)
onAccept(NewSocket);
//重新监听
mSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
}

/// <summary>
/// 数据接收处理
/// </summary>
/// <param name="ar"></param>
private void ReceiveCallback(IAsyncResult ar)
{
try
{
//
StateObject state = ar.AsyncState as StateObject;
//读取数据
int bytesRead = mSocket.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(UTF8Encoding.UTF8.GetString(state.buffer,
0, bytesRead));
string sb = state.sb.ToString();
//if (sb.Substring(sb.Length - 1, 1) == EndChar)
//{
//接收完成
//激发事件
if (onStreamDataAccept != null)
onStreamDataAccept(
this, FuncPlus.SubBytes(state.buffer, 0, bytesRead));
if (onStringDataAccept != null)
onStringDataAccept(
this, sb);
//
state = new StateObject();
state.workSocket
= mSocket;
//}
// Get the rest of the data.
mSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
else
{
//正常关闭
if (onClosed != null)
onClosed(
this,"OK");
}
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(
this, se.Message);
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}

}

/// <summary>
/// 发送 处理
/// </summary>
/// <param name="ar"></param>
private void SendCallBack(IAsyncResult ar)
{
try
{
mSocket.EndSend(ar);
//sendDone.Set();
//触发事件
if (onSended != null)
onSended(
this, "OK");
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(
this, se.Message);
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}

/// <summary>
/// 发送到 处理
/// </summary>
/// <param name="ar"></param>
private void SendToCallBack(IAsyncResult ar)
{
try
{
mSocket.EndSendTo(ar);
//sendToDone.Set();
if (onSendTo != null)
onSendTo(
this, "OK");
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(
this, se.Message);
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}

#endregion

}

 

2.AsyTcpCAsyTcpClient.cs

 

ContractedBlock.gifExpandedBlockStart.gif代码
public class AsyTcpClient
{
string _LocalIP;
int _LocalPort=5001;
AsySocket socket
= null;
bool _IsRun = false;

public bool IsRun
{
get {
return _IsRun;
}
set {
_IsRun
= value;
}
}



#region 构造函数
public AsyTcpClient(string LocalIP, int LocalPort)
{
socket
= new AsySocket(LocalIP, LocalPort);
}

public AsyTcpClient(Socket linkObject)
{
socket
= new AsySocket(linkObject);
IPEndPoint ep
=(IPEndPoint)linkObject.RemoteEndPoint;
_LocalIP
= ep.Address.ToString();
_LocalPort
= ep.Port;

}
#endregion

#region 公共方法
public bool ConnectServer(string ServerAddress,int ServerPort)
{
//连接
socket = new AsySocket(ServerAddress, 0);
socket.onSended
+= new AsySocket.AsySocketEventHandler(socket_onSended);
socket.onSendTo
+= new AsySocket.AsySocketEventHandler(socket_onSendTo);
socket.onStringDataAccept
+= new AsySocket.StringDataAcceptHandler(socket_onStringDataAccept);
socket.onStreamDataAccept
+= new AsySocket.StreamDataAcceptHandler(socket_onStreamDataAccept);
socket.onAccept
+= new AsySocket.AcceptEventHandler(socket_onAccept);
socket.onClosed
+= new AsySocket.AsySocketClosedEventHandler(socket_onClosed);
try
{

socket.LinkObject.Connect(ServerAddress, ServerPort);
socket.BeginAcceptData();
IsRun
= true;
return true;
}
catch
{
IsRun
= false;
return false;
}
}

void socket_onClosed(AsySocket AcceptedSocket, string ErrorMessage)
{
this.IsRun = false;
}

void socket_onAccept(AsySocket AcceptedSocket)
{
this.IsRun = true;
}

public void Send(byte[] sendByte)
{
socket.ASend(sendByte);
}

public void Send(string sendData)
{
socket.ASend(sendData);
}

public void DisConnect()
{
if (socket != null && socket.LinkObject.Connected)
{
socket.onSended
-= new AsySocket.AsySocketEventHandler(socket_onSended);
socket.onSendTo
-= new AsySocket.AsySocketEventHandler(socket_onSendTo);
socket.onStringDataAccept
-= new AsySocket.StringDataAcceptHandler(socket_onStringDataAccept);
socket.onStreamDataAccept
-= new AsySocket.StreamDataAcceptHandler(socket_onStreamDataAccept);
socket.onAccept
-= new AsySocket.AcceptEventHandler(socket_onAccept);
socket.onClosed
-= new AsySocket.AsySocketClosedEventHandler(socket_onClosed);
socket.LinkObject.Shutdown(SocketShutdown.Both);
IsRun
= false;
}
}
#endregion

void socket_onStreamDataAccept(AsySocket asySocket, byte[] AcceptData)
{
if (onStreamDataAccept != null)
{
onStreamDataAccept(asySocket, AcceptData);
}
}

void socket_onStringDataAccept(AsySocket asySocket, string AcceptData)
{
if (onStringDataAccept != null)
{
onStringDataAccept(asySocket, AcceptData);
}
}

void socket_onSendTo(AsySocket asySocket, string EventMessage)
{
if (onSendTo != null)
{
onSendTo(asySocket, EventMessage);
}
}

void socket_onSended(AsySocket asySocket, string EventMessage)
{
if (onSended != null)
{
onSended(asySocket, EventMessage);
}
}

#region 公共事件
/// <summary>
/// 客户端连接建立委托
/// </summary>
/// <param name="AcceptedSocket"></param>
public delegate void AcceptEventHandler(AsySocket AcceptedSocket);
/// <summary>
/// 客户端连接关闭委托
/// </summary>
/// <param name="SocketID"></param>
/// <param name="ErrorMessage"></param>
public delegate void AsySocketClosedEventHandler(AsySocket ClosedSocket, string ErrorMessage);
/// <summary>
/// 收到数据流委托
/// </summary>
/// <param name="AccepterID"></param>
/// <param name="AcceptData"></param>
public delegate void StreamDataAcceptHandler(AsySocket asySocket, byte[] AcceptData);
/// <summary>
/// Socket事件委托
/// </summary>
/// <param name="SenderID"></param>
/// <param name="EventMessage"></param>
public delegate void AsySocketEventHandler(AsySocket asySocket, string EventMessage);

/// <summary>
/// 收到文本数据委托
/// </summary>
/// <param name="AccepterID"></param>
/// <param name="AcceptData"></param>
public delegate void StringDataAcceptHandler(AsySocket asySocket, string AcceptData);


public event StreamDataAcceptHandler onStreamDataAccept = null;
public event StringDataAcceptHandler onStringDataAccept = null;
public event AsySocketEventHandler onSended = null;
public event AsySocketEventHandler onSendTo = null;
#endregion
}

 

 

转载于:https://www.cnblogs.com/Sue_/articles/1658264.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# params的用法详解

为了将方法声明为可以接受可变数量参数的方法&#xff0c;我们可以使用params关键字来声明数组,要求&#xff1a;(1)在方法声明中的 params 关键字之后不允许任何其他参数&#xff0c;并且在方法声明中只允许一个 params 关键字。(2)该参数必须标识一个一维数组&#xff0c;但类…

spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

公众号关注“程序员二哥”&#xff0c;设为‘星标’&#xff0c;带你学习更多的知识。本文内容 详细介绍5中bean的sope及使用注意点自定义作用域的实现应用中&#xff0c;有时候我们需要一个对象在整个应用中只有一个&#xff0c;有些对象希望每次使用的时候都重新创建一个&…

女生的拳头有多厉害?

1 天下武功唯快不破2 狗子&#xff1a;没想到我有这种天赋3 哈哈哈还是你社会啊4 女生的拳头有多厉害&#xff1f;?5 怎么解开的&#xff1f;6 心中有海&#xff0c;脚下有沙&#xff0c;这就是马尔代夫7 你的人生概括

与ln的指数转化公式_高考数学48条秒杀型公式与方法

点上方蓝字&#xff0c;关注“云学冠学习资讯”有助于提高成绩哦&#xff01;除了课本上的常规公式之外&#xff0c;掌握一些必备的秒杀型公式能够帮你在考试的时候节省大量的时间&#xff0c;师姐这次的分享就是48条秒杀公式&#xff0c;直接往下看&#xff01;1.适用条件&…

在C#2.0中使用Nullable可空类型

在C#1.x的版本中&#xff0c;一个值类型变量是不可以被赋予null值的&#xff0c;否则会产生异常。在C#2.0中&#xff0c;微软提供了Nullable类型&#xff0c;允许用它定义包含null值&#xff08;即空值&#xff09;的数据类型&#xff0c;这对处理数据库中包含可选字段以及很多…

豆瓣9.7,这些舍不得看完的神剧,看一集少一集!我刷了一晚上……

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——小樱&#xff0c;小樱&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过…

C#编码规范

1、连接数据库并返回DataTable View Code public DataTable GetDataByTable() { DataSet dataset new DataSet(); DataTable datatable null; SqlConnection sqlConnection new SqlConnection("Data Source.;Initial CatalogCalamity_Dat…

api中文文档 mws_中英文排版规范化 API

此文章对开放数据接口 API 之「中英文排版规范化 API」进行了功能介绍、使用场景介绍以及调用方法的说明&#xff0c;供用户在使用数据接口时参考之用。 1. 产品功能此次开放了中英文排版规范化在线接口&#xff0c;用于自动中英文排版、标点符号格式化&#xff0c;中英混排格式…

计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】

虚拟磁盘我们大家都可以看到但实际上是不存在的&#xff0c;虚拟的就是假的。虚拟磁盘是通过将一些网络文件或是内存利用科技手段伪造成磁盘&#xff0c;我们通常称它为虚拟磁盘。虚拟磁盘可以给内存增加容量&#xff0c;可以加快磁盘数据交换&#xff0c;提高计算机运行速度。…

记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析

一&#xff1a;背景 1. 讲故事这是6月中旬一位朋友加wx求助dump的故事&#xff0c;他的程序 cpu爆高➕UI卡死&#xff0c;问如何解决&#xff0c;截图如下&#xff1a;在拿到这个dump后&#xff0c;我发现这是一个关于机械臂的MRS程序&#xff0c;哈哈&#xff0c;在机械臂这种…

linux 信号_Linux中的信号处理机制 [四]

信号与线程Unix的信号机制在诞生之初&#xff0c;生活在只有进程(process)的相对单纯的环境中。自从Unix世界有了线程(thread)的概念&#xff0c;信号就被赋予了发往进程中某个特定线程的能力&#xff0c;当然&#xff0c;这也增加了整个信号机制实现的复杂度。本系列的前面三篇…

HP NIC Teaming技术探讨

NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用&#xff0c;以达到增加总的带宽(Load Balance&#xff0c;负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport&#xff0c;IP地址和网络设置绑定在这个逻…

仙居(一)

仙居&#xff08;一&#xff09; 仙居——仙人居住的地方。 景星岩全景 (看大图请点击) 其他图片在整理中&#xff0c;待我慢慢把图片和故事都理出来。转载于:https://www.cnblogs.com/hzy5901/archive/2011/03/31/5871611.html

我的电脑不联网,很安全!黑客:你还有风扇呢

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;机器之心参与&#xff1a;张倩、蛋酱、杜伟从1988年第一个网络蠕虫病毒诞生以来&#xff0c;「互联网危机四伏」的观念就已经深入人心。如果只是这样&#xff0c;不给电脑联网、禁止使用任何可移动储存介质&#xff0c;数…

移动终端测试进化论

2019独角兽企业重金招聘Python工程师标准>>> 移动终端测试进化论 本案例主要以5年的现身经历&#xff0c;阐述针对移动互联网终端测试&#xff0c;从最基础的原始时代如何进入到现代化时代&#xff1b;从单一到多点密集&#xff1b;从对产品的质量保障进化到对产品信…

计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...

人类并不是完美的&#xff0c;我们经常在编写软件的时候犯错误。有时这些错误很容易找到&#xff1a;你的代码根本不工作&#xff0c;你的应用程序会崩溃。但有些 bug 是隐藏的&#xff0c;很难发现&#xff0c;这使它们更加危险。在处理深度学习问题时&#xff0c;由于某些不确…

MySQL从原理到实践,一篇从头到尾讲清楚

前两天&#xff0c;我跟一个面试官聊天&#xff0c;发现一个普遍现象&#xff0c;不少候选人&#xff0c;对数据库的认知&#xff0c;还处在比较基础的阶段&#xff0c;以为会写“增删改查”、做表关联就足够了&#xff0c;那些工作中经常出现的问题&#xff0c;却支支吾吾答不…

库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例

头条号私信回复1&#xff0c;可免费获取海量资源下载链接本文任务&#xff1a;电动机启保停控制练习按下瞬时启动按钮I0.6&#xff0c;电动机Q0.0启动&#xff1b;按下瞬时停止按钮I0.7&#xff0c;电动机Q0.0停止。目录1.组态设备2.编写程序3.下载项目4.监视运行情况1.组态设备…

戴尔新版bios设置中文_戴尔电脑装机过程

戴尔电脑装机过程U盘制作过程&#xff1a;一&#xff1a;启动盘安装 win 101、准备工具&#xff1a;一块空的 8G 以上的 U 盘、一套官网下载的 win 10 操作系统 2、制作启动盘&#xff1a;将下载好的操作系统直接解压到U盘里面就完成了 二&#xff1a;pe 盘安装 win 101、准备工…

云计算

一 云计算 1 定义1&#xff09;新兴的互联网服务&#xff0c;该服务即是由成千上万的超级计算机构成的超强的计算机处理能力。2&#xff09;用户可以通过购买这种服务来满足本地对计算机运算能力需求。3&#xff09;互联网服务商一般会通过与某些需要计算机运算能力的软件的集成…