日期:2014-05-18  浏览次数:21000 次

异步 Socket how to ?
C# code


public class Server
{
  publoc Server()
  {
    Socket Accepter=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    Accepter.Bind(new IPEndPoint(ipAddress, 7070));
    GetNewClient += new AsyncCallback(PkManager_GetNewClient);
    //然后调用
    ccepter.Listen(1000);
    Accepter.BeginAccept(GetNewClient, Accepter);
  }
  
        void PkManager_GetNewClient(IAsyncResult ar)
        {
            //Accepter.EndAccept(
            Add(new T() { });
            Accepter.BeginAccept(GetNewClient, null);
            //autoEvent.Set();
        }
}






问题1:以Begin开头的方法是不是这样?
beginMethod(回调,state);

回调(state)
{
  endMethod
  //然后再调用
  beginMethod(回调,state)
}

从而形成循环?

问题2:
Socket的EndAccept方法 返回一个 新的 Socket对象那么 如果我要做上千人,上万人的服务器 岂不是也要产生成千上万的Socket对象?

问题3:有了异步方法(不使用线程)是不是就能够实现循环?
就是反复循环的递归 调用beginMethod 和EndMethod就是实现了循环而且主
进程也不会出现阻塞 是这样吗?


整个服务器使用一个Client类的对象 集合来维系


------解决方案--------------------
1.BeginAccept和EndAccept是配对用的。
2。对,每个用户维护一个socket连接
3。同步也能实现循环,只不过效率低。

第一条用来 接受新连接
第二条用来 处理逻辑
第三条用来 发送
第四条用来 接受
 
看来你弄混了。 看看接受的情况(发送同里)。假设已有了两个socket连接。
void OnConnectRequest(...)
{
.....
mySocket.BeginReceive(this.Buffer, 0, BufferSize, SocketFlags.None, GetrecieveData, null);
.....
}

void GetrecieveData(IAsyncResult ar)
{
//数据处理。 这并不意味着你用同一个线程进行mySocket1,mySocket2的数据处理。这只是个函数,每个调用系统都会分配独立的栈的,对于所有的socket的回调来说都是独立的(不靠率lock的情况)
}