实现基于事件通知的.Net套接字
2024-07-10 12:40:41
供稿:网友
以前学过MFC,我用过的它里面的包装Winsock的两个类CSocket和CAsyncSocket,我一直觉得它哪个事件通知的功能比较不错,特别是在连接的两方收发数据没有一定的规律的时候比较有用,虽然不用它的事件通知也可以实现功能,但是你需要循环检测套接字的状态或者阻塞等待,如果每次都要做这些琐碎的工作岂不是很麻烦,于是我就想对这些功能作一次封装。当然在.net里面采用delegate和event是最好的选择了。下面就是我实现的一些细节:
先讲一下思路:其实这个还是很简单了,估计高手们会不屑一顾了^_^。当套接字开始工作,比如开始监听、开始连接的时候,启动一个线程不停的检测套接字的状态,当某一事件的状态条件满足时就触发此事件,要知道具体检测套接字状态的方法,请往下看。
平常用套接字编成的时候可能需要用到的功能就是:连接成功或者失败的通知、在监听的套接字上有挂起的连接的通知、有数据可以接受的通知、套接字关闭的通知、还有套接字空闲可以发送数据的通知等,我也就使对上面几个功能作了封装,不过我觉得最后面一个功能用处不大???
我的Socket类是从System.Net.Sockets.Socket继承下来的,类名TcpEventSocket,实现如下:
先申明事件的委托类型,具体看代码
public delegate void AcceptConnectionHandler();
public delegate void ConnectCompletedHandler(bool connected); //connected表明连接成功与否
public delegate void DataCanSendHandler();
public delegate void DataCanReceiveHandler(int buffersize); //当前可以接受的数据量
public delegate void SocketClosedHandler();
这些类型具体什么意思应该能看出来吧,另外还要申明对应的事件
public event AcceptConnectionHandler AcceptConnection;
public event ConnectCompletedHandler ConnectCompleted;
public event DataCanSendHandler DataCanSend;
public event DataCanReceiveHandler DataCanReceive;
public event SocketClosedHandler SocketClosed;
另外加了几个虚方法,这几个方法用来触发事件
protected virtual void OnAcceptConnection();
protected virtual void OnConnectCompleted(bool connected)
protected virtual void OnDataCanSend()
protected virtual void OnDataCanReceive(int buffersize)
protected virtual void OnSocketClosed()
为了在适当的事机启动检测线程,我重写了几个基类的方法:
new public void Listen(int backlog)
{
base.Listen(backlog);
sockState = SocketState.Listenning;