server.BeginAccept(new AsyncCallback(AcceptConn), server);
private void AcceptConn(IAsyncResult iar)
{
Socket sock = (Socket)iar.AsyncState;//委托对象转换??
client = sock.EndAccept(iar); //?
对于iasyncresult接口的理解比较糊涂?
希望高手点拨下!
分比较少,请勿见怪啊!
private void AcceptConn(IAsyncResult iar)
{
Socket sock = (Socket)iar.AsyncState;//委托对象转换??
client = sock.EndAccept(iar); //?
对于iasyncresult接口的理解比较糊涂?
希望高手点拨下!
分比较少,请勿见怪啊!
server.BeginAccept(new AsyncCallback(AcceptConn), server);
这里,首先第一个参数是要你给出一个委托,当一个连接被接受之后调用这个委托。而第二个参数则是状态对象。你可以理解为调用这个委托所使用的参数。
从上面的代码中可以看出,你的委托是AcceptConn,而实际参数是server,很明显这个server就是你的socket。
这个iar对象是一个接口,通过这个接口可以取得你在BeginAccept时所传递的那个状态对象,只是它是object类型的,所以需要强制转换一次:
Socket sock = (Socket)iar.AsyncState;
您的意思是我通过AsyncCallback()方法异步调用委托AcceptConn,而传递过去的对象是server(其实它是主程序线程里面的一个 socket对象)而经过AsyncCallback()方法异步调用后,返回一个接口参数IAsyncResult iar,此刻其实iar就是原来的server对象,但已经被转换成了一个object类型。所以一上来把它转换过来?
不知道我的理解对不对,再求教。
(比较贪婪我,真是麻烦您了)
还有想问下,这样是不是如果很多client端 scoket连接上服务器来都能生成一个这样的子线程并继续和client 通讯直到结束。跟主监听的线程完全没有关系了,但这样子我疑问的是通讯端口是什么?因为主线程的侦听端口不可能被占用的啊,难到这个异步方法自己已经将和client 通讯端口从侦听端口改换到其他端口了??
谢谢指教!
不知道我的理解对不对,再求教。
(比较贪婪我,真是麻烦您了)对于你的理解,大体的流程是正确的。有几点仍需要说明:
1、AsyncCallback是委托类型,而不是方法。
你通过 new AsyncCallback(AcceptConn);实际上调用了AsyncCallback这种委托类型的构造函数(new 后面的都是构造函数)。这个构造函数的参数是一个方法名,也就是AcceptConn。
调用构造函数的结果,使你得到了一个AsyncCallback类型的委托。
2、iar就是IAsyncResult接口,而不是object类型对象。但是IAsyncResult它有一个属性:AsyncState,这才是你传递的server对象。后面关于object类型的理解是正确的。