I hear and I forget. I see and I remember. I do and I understand.
关键字:BeginConnect, IAsyncResult
1.关键点总结
- c#中socket进行异步连接,使用socket.BeginConnect(),返回一个异步操作的结果,记录了当前操作的状态。
BeginConnect()之后,系统会使用一个特殊的线程进行网络连接操作。操作完成后,调用回调函数。
举例其中一个异步连接方法的参数作为说明:
IAsyncResult BeginConnect(EndPoint endpoint,AsyncCallback callback,Object state):
IAsyncResult : 进行异步的socket连接的操作状态。
IAsyncResult.AsyncState 为BeginConnect中传入的state
IAsyncResult.IsCompleted 标识操作是否完成。(和是否连接成功没有关系)
IAsyncResult.AsyncWaitHandle 返回一个WaitHandler,用于设置信号量,等待一定时间之后,返回操作是否完成。(阻塞线程)
AsyncCallback callback:异步连接操作完成之后,调用的回调。
Object state: 应该传入一个socket,以记录当前socket的连接情况。
使用BeginConnect之后,在操作结果的回调中,需要调用EndConnect()方法以完成连接。
连接操作在连接成功或者连接异常之后结束。
如果socket开始连接一个没有监听的ip和端口,或者网络情况有波动的时候,默认的连接超时时间很久。这个时候,可以使用IAsyncResult和IAsyncResult.AsyncWaitHandle来手动在一定时间内提前结束socket.(实验的时候,如果连接的时候本地ip,即使没有监听,也会很快完成连接操作。因此,实验的时候要连接一个其他ip)
关于Socket的一些方法:
Socket.Connected : 是否与远程host连接。(UDP永远返回true)
Socket.Available : 可以读取的数据(从网络中接收的数据)的数量
Socket.ShutDown : 关闭Socekt的发送和接收数据功能。面向连接的连接中,在Close之前调用可以保证所有的数据都被发送和接收了。
Socket.Close() : 关闭socket连接,并且释放所有关联的资源。
Socket.Close(Int32 timeout) : 设置一个timeout时间以使得发送队列中的数据可以被发送。之后关闭socket连接,并且释放所有关联的资源socket.ShutDown(SocketShutdown.Both);
socket.Close();
2.示例代码:
1.客户端c#代码
1 | using System.Collections.Generic; |
2.服务端python代码
1 | # -*- coding:utf-8 -*- |