All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
使用 JavaScript 和 Ajax 发出异步请求_[AJAX教程]
asp.net2.0两句代码搞定文件上传_[Asp.Net教程]
单击gridview中记录在右下方显示详细信息_[Asp.Net教程]
用SQL,Server,Prompt提高开发能力_[SQL,Server教程]
DOTNET:LINQ与ADO.NET,3.0的创新_.net资料_编程技术
visual c++中基类与派生类概念
DIV+CSS网页制作布局技巧学习_[Html教程]
用XMLHTTP对象抓取网页源代码,拆分数据写入数据库_[XML教程]
AJAX的JavaScript的反射机制_[Asp.Net教程]
使用ascx和Div来扩充列表框选择功能_[Asp.Net教程]
Reading number is top 10 pictures
29 the belle stars after bath figure2
Take you to walk into the most true north Korea rural1
世界五大海盗
壮丽的云彩1
China's programmers are live what kind, had a look at will know that
[猫扑大杂烩]华东师范墙上看到的捐精告示 15毫升3600元
牛奶和人奶哪个好?
男人帮杂志里的惹火性感美女1
Sora aoi on twitter2
The real super beauty4
Download software ranking
Be there or be square
塘西风月痕
Unix video tutorial11
致我们终将逝去的青春
Tram sex maniac 2 (H) rar bag9
Boxer Classic video2
艳兽都市
C语言教程TXT
C++教程第四版
Red cliff
delv published in(发表于) 2014/1/6 9:12:18 Edit(编辑)
实现基于事件通知的.Net套接字_[Asp.Net教程]

实现基于事件通知的.Net套接字_[Asp.Net教程]

实现基于事件通知的.Net套接字_[Asp.Net教程]

以前学过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;

if (!checkThread.IsAlive)

checkThread.Start();

}

new public void Connect(EndPoint remoteEP)

{

try

{

base.Connect(remoteEP);

this.Blocking = false; //设置非阻塞状态,以便事件通知的效率

if (!checkThread.IsAlive)

checkThread.Start();

}

catch(SocketException)

{

OnConnectCompleted(false);

}

}

这两个方法实际编成中都应该首先被调用的,所以有他们启动检测线程比较合适,另外线程启动了必然也要中止,于是我重写了Close方法

new public void Close()

{

if(checkThread.IsAlive) //先中止线程再关闭连接

checkThread.Abort();

base.Close();

sockState = SocketState.Disconnected;

OnSocketClosed();

}

于是剩下的工作就是怎么检测套接字了,Socket类有个Select的静态方法,它可以检测很多套接字的状态,不过这里只需要检测一个,所以直接用Socket的Poll方法,Poll的具体用法可以看MSDN,我这里用代码说明我对套接字的检测方法

while(true) //循环检查

{

if (sockState == SocketState.Disconnected) //如果当前没有连接

{

if (Poll(500, SelectMode.SelectWrite))

OnConnectCompleted(true); //如果为可写状态,则表示连接成功

}

else if(sockState == SocketState.Listenning)

{

if (Poll(500, SelectMode.SelectRead)) //如果在监听状态发现套接字有数据可读则表示已经有人连接上来可以调用Accept接受连接

OnAcceptConnection();

}

else //这里sockState = SocketState.Connected

{

if (Poll(500, SelectMode.SelectWrite)) //如果有可写状态则表示可以发送数据

OnDataCanSend();

if (Poll(500, SelectMode.SelectRead)) //如果有可读状态

{

if (Available > 0) //如果有数据可读表示可以调用Receive接受数据

OnDataCanReceive(Available);

else

{

OnSocketClosed(); //没数据可读表示连接已经关闭

break;

}

}

}

//如果没有连接并且有错误状态,则连接失败

if (sockState == SocketState.Disconnected && Poll(500, SelectMode.SelectError))

OnConnectCompleted(false);

}

这里的OnXXX方法就是执行事件通知的方法,并且派生类中可以重载这些方法直接获得事件通知而不需要挂界别的事件通知处理函数(类似于MFC的OnAccept等虚函数)。不过派生的函数集的调用基类的相应方法哦。很可惜没有重写Socket.Accept方法,让它返回一个TcpEventSocket,这样应该就比较完整了,只可惜我不知道怎么做^_^,如果谁知道的话欢迎指教。

事件通知机制已经基本完成,所缺乏的只是大量的测试(我做了几下最简单的测试,惭愧!!^_^)

如果有问题请联系 yzx110@bit.edu.cn
来源:ASPCOOL





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.