异步Socket2011-02-13 cnblogs idior在网络通讯的编程中我们经常使用到Socket, 这种情况下我们往往需要长期的监听某个端口, 以获得相应的Socket, 然后再利用它进行相关操作.但是这样的话, 主线程就会被阻塞.无法对其他时间做出相应.其实在.Net的Socket类中提供了对异步操作的支持.下面将介绍其基本原理, 以及利用它做的一个P2P的实现.背景知识:你需要了解有关Socket的基本知识, 以及Delegate的异步调用操作.在这个例子中, 我们实现了一个利用非阻塞(non-blocking)的Socket进行局域网通讯的P2P应用.每个客户拥有一个Grid(类似于一个二维数组), 当它启动Grid设置服务的时候,一旦别的客户与它相连就可以查询并修改某个网格中的数值.(比如查询 grid[1][2]的值).运行步骤:1.启动服务 在某个客户端输入 start 400 (400是端口号, 你可以任意指定)2.连接其他Peer 在另一个客户端中输入 connect 202.119.9.12 400 (202.119.9.12 400是某个开启服务的客户端的IP地址)3.输入 get 1 1 表示你想获得grid[1][1]这个网格中的数值.默认情况下得到04.输入 set 1 1 5 表示你想设置grid[1][1]这个网格中的数值为5 .5.再次输入 get 1 1 查询到结果为已修改的56.输入shutdown 关闭与刚才与当前的Peer的连接.你可以再次连接别的Peer运行示意图.

在通常的应用中Server往往需要长期处于监听状态, 以等待Client的连接.下面是一个典型的应用.
private Socket client = null;
const int nPortListen = 399;
try
{
TcpListener listener = new TcpListener( nPortListen );
Console.WriteLine( "Listening as {0}", listener.LocalEndpoint );
listener.Start();
do
{
byte [] m_byBuff = new byte[127];
if( listener.Pending() )
{
client = listener.AcceptSocket();
// Get current date and time.
DateTime now = DateTime.Now;
string strDateLine = "Welcome " + now.ToString("G") + "nr";
// Convert to byte array and send.
Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes( strDateLine.ToCharArray() );
client.Send( byteDateLine, byteDateLine.Length, 0 );
}
else
{
Thread.Sleep( 100 );
}
} while( true ); // Don"t use this.
}
catch( Exception ex )
{
Console.WriteLine ( ex.Message );
}