代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
CSharp
】
异步通信基于IOCP完成端口的组件实现
作者:
Dezai.CN
/ 发布于
2013/7/16
/
765
源代码: 客户端: using System; using System.IO; using System.ComponentModel; using System.Collections; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; namespace MyKJ { /// <summary> /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端 /// </summary> public class MyTcpIpClient : System.ComponentModel.Component { private int bufferSize=2048; private string tcpIpServerIP="127.0.0.1"; private int tcpIpServerPort=11000; private Socket ClientSocket=null; private ManualResetEvent connectDone = new ManualResetEvent(false); private ManualResetEvent sendDone = new ManualResetEvent(false); private void ConnectCallback(IAsyncResult ar) { try { Socket client = (Socket) ar.AsyncState; client.EndConnect(ar); } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } finally { connectDone.Set(); } } private void SendCallback(IAsyncResult ar) { try { Socket client = (Socket) ar.AsyncState; int bytesSent = client.EndSend(ar); //Console.WriteLine(bytesSent); } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } finally { sendDone.Set(); } } private void ReceiveCallback(IAsyncResult ar) { Socket handler=null; try { lock(ar) { StateObject state = (StateObject) ar.AsyncState; handler = state.workSocket; int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { int ReadPiont=0; while(ReadPiont<bytesRead) { if(state.Cortrol==0 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<24)&0xff000000; state.packSize=bi1; ReadPiont++; state.Cortrol=1; } if(state.Cortrol==1 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<16)&0x00ff0000; state.packSize=state.packSize+bi1; ReadPiont++; state.Cortrol=2; } if(state.Cortrol==2 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<8)&0x0000ff00; state.packSize=state.packSize+bi1; ReadPiont++; state.Cortrol=3; } if(state.Cortrol==3 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=bi1&0xff; state.packSize=state.packSize+bi1-4; ReadPiont++; state.Cortrol=4; } if(state.Cortrol==4 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<24)&0xff000000; state.residualSize=bi1; ReadPiont++; state.Cortrol=5; state.packSize-=1; } if(state.Cortrol==5 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<16)&0x00ff0000; state.residualSize=state.residualSize+bi1; ReadPiont++; state.Cortrol=6; state.packSize-=1; } if(state.Cortrol==6 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<8)&0x0000ff00; state.residualSize=state.residualSize+bi1; ReadPiont++; state.Cortrol=7; state.packSize-=1; } if(state.Cortrol==7 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=bi1&0xff; state.residualSize=state.residualSize+bi1; state.Datastream.SetLength(0); state.Datastream.Position=0; ReadPiont++; state.Cortrol=8; state.packSize-=1; } if(state.Cortrol==8 && ReadPiont<bytesRead) { int bi1=bytesRead-ReadPiont; int bi2=(int)(state.residualSize-state.Datastream.Length); if(bi1>=bi2) { state.Datastream.Write(state.buffer,ReadPiont,bi2); ReadPiont+=bi2; OnInceptEvent(new InceptEventArgs(state.Datastream,handler)); state.Cortrol=9; state.packSize-=bi2; } else { state.Datastream.Write(state.buffer,ReadPiont,bi1); ReadPiont+=bi1; state.packSize-=bi1; } } if(state.Cortrol==9 && ReadPiont<bytesRead) { int bi1=bytesRead-ReadPiont; if(bi1<state.packSize) { state.packSize=state.packSize-bi1; ReadPiont+=bi1; } else { state.Cortrol=0; ReadPiont+=(int)state.packSize; } } } } else { throw(new Exception("读入的数据小于1bit")); } if(handler.Connected==true) { handler.BeginReceive(state.buffer,0,bufferSize,0, new AsyncCallback(ReceiveCallback), state); } } } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /// <summary> /// 连接服务器 /// </summary> public void Conn() { try { ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP); IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort); connectDone.Reset(); ClientSocket.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback),ClientSocket); connectDone.WaitOne(); StateObject state = new StateObject(bufferSize,ClientSocket); ClientSocket.BeginReceive(state.buffer,0,bufferSize,0, new AsyncCallback(ReceiveCallback), state); } catch(Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /// <summary> /// 断开连接 /// </summary> public void Close() { try { if(ClientSocket.Connected==true) { ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); } } catch(Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /// <summary> /// 发送一个流数据 /// </summary> /// <param name="Astream">数据流</param> public void Send(Stream Astream) { try { if(ClientSocket.Connected==false) { throw(new Exception("没有连接服务器不可以发送信息!")); } Astream.Position=0; byte[] byteData=new byte[bufferSize]; int bi1=(int)((Astream.Length+8)/bufferSize); int bi2=(int)Astream.Length; if(((Astream.Length+8)%bufferSize)>0) { bi1=bi1+1; } bi1=bi1*bufferSize; byteData[0]=System.Convert.ToByte(bi1>>24); byteData[1]=System.Convert.ToByte((bi1&0x00ff0000)>>16); byteData[2]=System.Convert.ToByte((bi1&0x0000ff00)>>8); byteData[3]=System.Convert.ToByte((bi1&0x000000ff)); byteData[4]=System.Convert.ToByte(bi2>>24); byteData[5]=System.Convert.ToByte((bi2&0x00ff0000)>>16); byteData[6]=System.Convert.ToByte((bi2&0x0000ff00)>>8); byteData[7]=System.Convert.ToByte((bi2&0x000000ff)); int n = Astream.Read(byteData, 8, byteData.Length-8); while (n>0) { ClientSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), ClientSocket); sendDone.WaitOne(); byteData=new byte[bufferSize]; n = Astream.Read(byteData,0,byteData.Length); } } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /// <summary> /// 构造 /// </summary> /// <param name="container">父控件</param> public MyTcpIpClient(System.ComponentModel.IContainer container) { container.Add(this); InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// <summary> /// 构造 /// </summary> public MyTcpIpClient() { InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } #region Component Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { } #endregion /// <summary> /// 要连接的服务器IP地址 /// </summary> public string TcpIpServerIP { get { return tcpIpServerIP; } set { tcpIpServerIP=value; } } /// <summary> /// 要连接的服务器所使用的端口 /// </summary> public int TcpIpServerPort { get { return tcpIpServerPort; } set { tcpIpServerPort=value; } } /// <summary> /// 缓冲器大小 /// </summary> public int BufferSize { get { return bufferSize; } set { bufferSize=value; } } /// <summary> /// 连接的活动状态 /// </summary> public bool Activ { get { if(ClientSocket==null) { return false; } return ClientSocket.Connected; } } /// <summary> /// 接收到数据引发的事件 /// </summary> public event InceptEvent Incept; /// <summary> /// 引发接收数据事件 /// </summary> /// <param name="e">接收数据</param> protected virtual void OnInceptEvent(InceptEventArgs e) { if (Incept != null) { Incept(this, e); } } /// <summary> /// 发生错误引发的事件 /// </summary> public event ErrorEvent Error; /// <summary> /// 引发错误事件 /// </summary> /// <param name="e">错误数据</param> protected virtual void OnErrorEvent(ErrorEventArgs e) { if (Error != null) { Error(this, e); } } } /// <summary> /// 接收数据事件 /// </summary> public class InceptEventArgs : EventArgs { private readonly Stream datastream; private readonly Socket clientSocket; /// <summary> /// 构造 /// </summary> /// <param name="Astream">接收到的数据</param> /// <param name="ClientSocket">接收的插座</param> public InceptEventArgs(Stream Astream,Socket ClientSocket) { datastream=Astream; clientSocket=ClientSocket; } /// <summary> /// 接受的数据流 /// </summary> public Stream Astream { get { return datastream;} } /// <summary> /// 接收的插座 /// </summary> public Socket ClientSocket { get { return clientSocket;} } } /// <summary> /// 定义接收委托 /// </summary> public delegate void InceptEvent(object sender, InceptEventArgs e); /// <summary> /// 错处事件 /// </summary> public class ErrorEventArgs : EventArgs { private readonly Exception error; /// <summary> /// 构造 /// </summary> /// <param name="Error">错误信息对象</param> public ErrorEventArgs(Exception Error) { error=Error; } /// <summary> /// 错误信息对象 /// </summary> public Exception Error { get { return error;} } } /// <summary> /// 错误委托 /// </summary> public delegate void ErrorEvent(object sender, ErrorEventArgs e); } 服务器端: using System; using System.IO; using System.ComponentModel; using System.Collections; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; namespace MyKJ { /// <summary> /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端 /// </summary> public class MyTcpIpServer : System.ComponentModel.Component { private int bufferSize=2048; private string tcpIpServerIP=""; private int tcpIpServerPort=11000; private Socket listener=null; private ManualResetEvent allDone = new ManualResetEvent(false); private ManualResetEvent sendDone = new ManualResetEvent(false); private Thread thread=null; private void StartListening() { try { listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress; if(tcpIpServerIP.Trim()=="") { ipAddress=IPAddress.Any; } else { ipAddress=IPAddress.Parse(tcpIpServerIP); } IPEndPoint localEndPoint = new IPEndPoint(ipAddress, tcpIpServerPort); listener.Bind(localEndPoint); listener.Listen(10); while (true) { allDone.Reset(); listener.BeginAccept(new AsyncCallback(AcceptCallback),listener); allDone.WaitOne(); } } catch (Exception e) { OnErrorServerEvent(new ErrorServerEventArgs(e,listener)); } } private void ReadCallback(IAsyncResult ar) { Socket handler=null; try { lock(ar) { StateObject state = (StateObject) ar.AsyncState; handler = state.workSocket; int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { int ReadPiont=0; while(ReadPiont<bytesRead) { if(state.Cortrol==0 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<24)&0xff000000; state.packSize=bi1; ReadPiont++; state.Cortrol=1; } if(state.Cortrol==1 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<16)&0x00ff0000; state.packSize=state.packSize+bi1; ReadPiont++; state.Cortrol=2; } if(state.Cortrol==2 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<8)&0x0000ff00; state.packSize=state.packSize+bi1; ReadPiont++; state.Cortrol=3; } if(state.Cortrol==3 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=bi1&0xff; state.packSize=state.packSize+bi1-4; ReadPiont++; state.Cortrol=4; } if(state.Cortrol==4 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<24)&0xff000000; state.residualSize=bi1; ReadPiont++; state.Cortrol=5; state.packSize-=1; } if(state.Cortrol==5 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<16)&0x00ff0000; state.residualSize=state.residualSize+bi1; ReadPiont++; state.Cortrol=6; state.packSize-=1; } if(state.Cortrol==6 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=(bi1<<8)&0x0000ff00; state.residualSize=state.residualSize+bi1; ReadPiont++; state.Cortrol=7; state.packSize-=1; } if(state.Cortrol==7 && ReadPiont<bytesRead) { long bi1=state.buffer[ReadPiont]; bi1=bi1&0xff; state.residualSize=state.residualSize+bi1; state.Datastream.SetLength(0); state.Datastream.Position=0; ReadPiont++; state.Cortrol=8; state.packSize-=1; } if(state.Cortrol==8 && ReadPiont<bytesRead) { int bi1=bytesRead-ReadPiont; int bi2=(int)(state.residualSize-state.Datastream.Length); if(bi1>=bi2) { state.Datastream.Write(state.buffer,ReadPiont,bi2); ReadPiont+=bi2; OnInceptServerEvent(new InceptServerEventArgs(state.Datastream,state.workSocket,this)); state.Cortrol=9; state.packSize-=bi2; } else { state.Datastream.Write(state.buffer,ReadPiont,bi1); ReadPiont+=bi1; state.packSize-=bi1; } } if(state.Cortrol==9 && ReadPiont<bytesRead) { int bi1=bytesRead-ReadPiont; if(bi1<state.packSize) { state.packSize=state.packSize-bi1; ReadPiont+=bi1; } else { state.Cortrol=0; ReadPiont+=(int)state.packSize; } } } if(handler.Connected==true) { handler.BeginReceive(state.buffer,0,bufferSize,0, new AsyncCallback(ReadCallback), state); } } else { handler.Shutdown(SocketShutdown.Both); handler.Close(); //throw(new Exception("读入的数据小于1bit")); } } } catch (Exception e) { OnErrorServerEvent(new ErrorServerEventArgs(e,handler)); } } private void SendCallback(IAsyncResult ar) { Socket client = (Socket) ar.AsyncState; try { int bytesSent = client.EndSend(ar); } catch (Exception e) { OnErrorServerEvent(new ErrorServerEventArgs(e,client)); } finally { sendDone.Set(); } } private void AcceptCallback(IAsyncResult ar) { Socket handler=null; try { Socket listener = (Socket) ar.AsyncState; handler= listener.EndAccept(ar); StateObject state = new StateObject(bufferSize,handler); state.workSocket = handler; handler.BeginReceive(state.buffer,0,bufferSize,0, new AsyncCallback(ReadCallback), state); } catch (Exception e) { OnErrorServerEvent(new ErrorServerEventArgs(e,handler)); } finally { allDone.Set(); } } /// <summary> /// 析构 /// </summary> /// <param name="disposing">不知道</param> protected override void Dispose(bool disposing) { Abort(); } /// <summary> /// 引发接收事件 /// </summary> /// <param name="e">数据</param> protected virtual void OnInceptServerEvent(InceptServerEventArgs e) { if (InceptServer != null) { InceptServer(this, e); } } /// <summary> /// 引发错误事件 /// </summary> /// <param name="e">数据</param> protected virtual void OnErrorServerEvent(ErrorServerEventArgs e) { if (ErrorServer != null) { ErrorServer(this, e); } } /// <summary> /// 开始监听访问 /// </summary> public void Listening() { //StartListening(); thread=new Thread(new ThreadStart(StartListening)); thread.Name="MyTcpIpServer.Listening"; thread.Start(); } /// <summary> /// 异常中止服务 /// </summary> public void Abort() { if(thread!=null) { thread.Abort(); listener.Close(); } } /// <summary> ///构造 /// </summary> /// <param name="container">父控件</param> public MyTcpIpServer(System.ComponentModel.IContainer container) { container.Add(this); InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// <summary> /// 构造 /// </summary> public MyTcpIpServer() { InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } #region Component Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { } #endregion /// <summary> /// 要连接的服务器IP地址 /// </summary> public string TcpIpServerIP { get { return tcpIpServerIP; } set { tcpIpServerIP=value; } } /// <summary> /// 要连接的服务器所使用的端口 /// </summary> public int TcpIpServerPort { get { return tcpIpServerPort; } set { tcpIpServerPort=value; } } /// <summary> /// 缓冲器大小 /// </summary> public int BufferSize { get { return bufferSize; } set { bufferSize=value; } } /// <summary> /// 连接的活动状态 /// </summary> public bool Activ { get { return listener.Connected; } //set //{ // activ=value; //} } /// <summary> /// 发送一个流数据 /// </summary> public void Send(Socket ClientSocket,Stream Astream) { try { if(ClientSocket.Connected==false) { throw(new Exception("没有连接客户端不可以发送信息!")); } Astream.Position=0; byte[] byteData=new byte[bufferSize]; int bi1=(int)((Astream.Length+8)/bufferSize); int bi2=(int)Astream.Length; if(((Astream.Length+8)%bufferSize)>0) { bi1=bi1+1; } bi1=bi1*bufferSize; byteData[0]=System.Convert.ToByte(bi1>>24); byteData[1]=System.Convert.ToByte((bi1&0x00ff0000)>>16); byteData[2]=System.Convert.ToByte((bi1&0x0000ff00)>>8); byteData[3]=System.Convert.ToByte((bi1&0x000000ff)); byteData[4]=System.Convert.ToByte(bi2>>24); byteData[5]=System.Convert.ToByte((bi2&0x00ff0000)>>16); byteData[6]=System.Convert.ToByte((bi2&0x0000ff00)>>8); byteData[7]=System.Convert.ToByte((bi2&0x000000ff)); int n = Astream.Read(byteData, 8, byteData.Length-8); while (n>0) { ClientSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), ClientSocket); sendDone.WaitOne(); byteData=new byte[bufferSize]; n = Astream.Read(byteData,0,byteData.Length); } } catch (Exception e) { OnErrorServerEvent(new ErrorServerEventArgs(e,ClientSocket)); } } /// <summary> /// 接收到数据事件 /// </summary> public event InceptServerEvent InceptServer; /// <summary> /// 发生错误事件 /// </summary> public event ErrorServerEvent ErrorServer; } /// <summary> /// 状态对象 /// </summary> public class StateObject { /// <summary> /// 构造 /// </summary> /// <param name="bufferSize">缓存</param> /// <param name="WorkSocket">工作的插座</param> public StateObject(int bufferSize,Socket WorkSocket) { buffer = new byte[bufferSize]; workSocket=WorkSocket; } /// <summary> /// 缓存 /// </summary> public byte[] buffer = null; /// <summary> /// 工作插座 /// </summary> public Socket workSocket = null; /// <summary> /// 数据流 /// </summary> public Stream Datastream=new MemoryStream(); /// <summary> /// 剩余大小 /// </summary> public long residualSize=0; /// <summary> /// 数据包大小 /// </summary> public long packSize=0; /// <summary> /// 计数器 /// </summary> public int Cortrol=0; } /// <summary> /// 接收事件 /// </summary> public class InceptServerEventArgs : EventArgs { private readonly Stream datastream; private readonly Socket serverSocket; private readonly MyTcpIpServer tcpIpServer; /// <summary> /// 构造 /// </summary> /// <param name="Astream">数据</param> /// <param name="ServerSocket">工作插座</param> /// <param name="TcpIpServer">提供服务的TCP/IP对象</param> public InceptServerEventArgs(Stream Astream,Socket ServerSocket,MyTcpIpServer TcpIpServer) { datastream=Astream; serverSocket=ServerSocket; tcpIpServer=TcpIpServer; } /// <summary> /// 数据 /// </summary> public Stream Astream { get { return datastream;} } /// <summary> /// 工作插座 /// </summary> public Socket ServerSocket { get { return serverSocket;} } /// <summary> /// 提供TCP/IP服务的服务器对象. /// </summary> public MyTcpIpServer TcpIpServer { get { return tcpIpServer;} } } /// <summary> /// 接收数据委托 /// </summary> public delegate void InceptServerEvent(object sender, InceptServerEventArgs e); /// <summary> /// 错误事件委托 /// </summary> public class ErrorServerEventArgs : EventArgs { private readonly Exception error; private readonly Socket serverSocket; /// <summary> /// 构造 /// </summary> /// <param name="Error">数据</param> /// <param name="ServerSocket">问题插座</param> public ErrorServerEventArgs(Exception Error,Socket ServerSocket) { error=Error; serverSocket=ServerSocket; } /// <summary> /// 数据 /// </summary> public Exception Error { get { return error;} } /// <summary> /// 问题插座 /// </summary> public Socket ServerSocket { get { return serverSocket;} } } /// <summary> ///错误事件委托 /// </summary> public delegate void ErrorServerEvent(object sender, ErrorServerEventArgs e); }
试试其它关键字
IOCP
同语言下
.
文件IO 操作类库
.
Check图片类型[JPEG(.jpg 、.jpeg),TIF,GIF,BMP,PNG,P
.
机器名和IP取得(IPV4 IPV6)
.
Tiff转换Bitmap
.
linqHelper
.
MadieHelper.cs
.
RegHelper.cs
.
如果关闭一个窗体后激活另一个窗体的事件或方法
.
创建日志通用类
.
串口辅助开发类
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
Dezai.CN
贡献的其它代码
(
4037
)
.
多线程Socket服务器模块
.
生成随机密码
.
清除浮动样式
.
弹出窗口居中
.
抓取url的函数
.
使用base HTTP验证
.
div模拟iframe嵌入效果
.
通过header转向的方法
.
Session操作类
.
执行sqlite输入插入操作后获得自动编号的ID
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3