示例#1
0
    //监听到消息之后调用的函数
    private void AsyncRecive(IAsyncResult ar)
    {
        try
        {
            NetUserToken userToken = ar.AsyncState as NetUserToken;
            int          length    = userToken.socket.EndReceive(ar);//结束接收
            if (length == 0)
            {
                userToken.socket.Close();
                return;
            }
            userToken.Receive(length);
            BeginReceive(userToken);

            //if (length > 0) {
            //    byte[] data = new byte[length];
            //    Buffer.BlockCopy(userToken.Buffer, 0, data, 0, length);
            //    //用户接受消息
            //    userToken.Receive(data);
            //    //尾递归,再次监听客户端消息
            //    BeginReceive(userToken);
            //}
        }
        catch (Exception ex) {
            UnityEngine.Debug.Log(ex.ToString());
        }
    }
示例#2
0
 //异步监听消息
 private void BeginReceive(NetUserToken userToken)
 {
     try
     {
         userToken.socket.BeginReceive(userToken.Buffer, userToken.StartIndex, userToken.RemianSize, SocketFlags.None, AsyncRecive, userToken);
     }
     catch (Exception ex) {
         UnityEngine.Debug.Log(ex.ToString());
     }
 }
 //异步监听消息
 private void BeginReceive(NetUserToken userToken)
 {
     try
     {
         //异步方法
         userToken.socket.BeginReceive(userToken.buffer, 0, userToken.buffer.Length, SocketFlags.None,
                                       EndReceive, userToken);
     }
     catch (Exception ex)
     {
         UnityEngine.Debug.Log(ex.ToString());
     }
 }
 //开启服务器
 public void Start()
 {
     server.Listen(maxClient);
     UnityEngine.Debug.Log("Server OK!");
     //实例化客户端的用户池
     pools = new Stack <NetUserToken>(maxClient);
     for (int i = 0; i < maxClient; i++)
     {
         NetUserToken usertoken = new NetUserToken();
         pools.Push(usertoken);
     }
     //可以异步接受客户端, BeginAccept函数的第一个参数是回调函数,当有客户端连接的时候自动调用
     server.BeginAccept(AsyncAccept, null);
 }
    //回调函数, 有客户端连接的时候会自动调用此方法
    private void AsyncAccept(IAsyncResult result)
    {
        try
        {
            //结束监听,同时获取到客户端
            Socket client = server.EndAccept(result);
            UnityEngine.Debug.Log("有客户端连接");
            //来了一个客户端
            NetUserToken userToken = pools.Pop();
            userToken.socket = client;
            //客户端连接之后,可以接受客户端消息
            BeginReceive(userToken);

            //尾递归,再次监听是否还有其他客户端连入
            server.BeginAccept(AsyncAccept, null);
        }
        catch (Exception ex)
        {
            UnityEngine.Debug.Log(ex.ToString());
        }
    }
 //监听到消息之后调用的函数
 private void EndReceive(IAsyncResult result)
 {
     try
     {
         //取出客户端
         NetUserToken userToken = result.AsyncState as NetUserToken;
         //获取消息的长度
         int len = userToken.socket.EndReceive(result);
         if (len > 0)
         {
             byte[] data = new byte[len];
             Buffer.BlockCopy(userToken.buffer, 0, data, 0, len);
             //用户接受消息
             userToken.Receive(data);
             //尾递归,再次监听客户端消息
             BeginReceive(userToken);
         }
     }
     catch (Exception ex)
     {
         UnityEngine.Debug.Log(ex.ToString());
     }
 }