1.AsySocket.cs

代码

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

代码

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

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

  1. [转载]C# WinForm开发系列 - 文章索引

    该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm ...

  2. C# WinForm开发系列

    文章来源:博客园 该系列主要整理收集在使用C#开发WinForm应用文章及相关代码, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自 ...

  3. C# WinForm开发系列 - GDI+【转】

    http://blog.csdn.net/blue_sky6/article/details/53811435?locationNum=6&fps=1 C# WinForm开发系列 - GDI ...

  4. C# WinForm开发系列 - Open-Source Controls

    整理了一些在WinForm开发中可以使用的开源组件.(文章及相关代码搜集自网络,仅供学习参考,版权属于原作者! ). 1. 仿office 2007的Ribbon风格面板(该控件模仿office 20 ...

  5. vscode中安装webpack_leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址w ...

  6. android开发JNI之高级篇

    android开发JNI之高级篇 一,JNI介绍 百度百科 : http://baike.baidu.com/view/1272329.htm 二,JNI开发教程 1,JNI注册方式有两种,一种是静态 ...

  7. C# WinForm开发系列 - OWC

    OWC(Microsoft Office Web Components)是 Microsoft Office 使用的数据绑定 ActiveX 控件,用于向 Web 页添加图表功能.OWC支持Micro ...

  8. C# WinForm开发系列 - Excel

    01. 仅使用Dataset导入数据到Excel [翻译] Senthil S著Export data to Excel using Dataset only [简介] 当前,网上已经有了不少的导入数 ...

  9. openlayers4 入门开发系列之风场图篇

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

最新文章

  1. python数据文件读写
  2. [转] 不要被C++“自动生成”所蒙骗
  3. PCB设计用什么软件好?
  4. linux的子进程和父进程,[Linux进程]在父进程和子进程中分别对文件进行操作
  5. C++实现插值查找(附完整源码)
  6. 结构化并发应用程序——任务执行
  7. extjs 表单验证实例
  8. Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起
  9. Linux : top命令
  10. 阻止页面电话号码变蓝
  11. 在CentOs6.5安装jdk
  12. Java连接数据库访问失败
  13. 原生JS成语接龙小游戏
  14. WinRunner和QTP对比
  15. Windows系统基础配置
  16. 在本地运行scala程序报错 requirement failed: Can only call getServletHandlers on a running MetricsSystem
  17. rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
  18. 后端node-xlsx读取excel文件后时间格式的转换 - 利用xlsx自带方法
  19. 有趣的java代码_求一些有趣的java小程序?
  20. EventLog Analyzer应用程序日志管理

热门文章

  1. javascript设计思维
  2. 表单提交中Get和Post方式的区别及EncType表明提交数据的格式详解
  3. android应用退出后广播无效,关闭应用程序后,保持广播接收器运行
  4. 底层系统如何实现数据一致性/系统底层如何保证有序性
  5. @Transactional 使用
  6. android navigation bar高度,Android获取屏幕真实高度包含NavigationBar(底部虚拟按键)
  7. Asp.Net Core + Docker 搭建
  8. C#中的几个实用的代码
  9. nginx做服务器入口_Nginx实现http反向代理
  10. http请求中的Query String Parameters、Form Data、Request Payload