网络通信框架-通过消息中心 单例

internal class NetManager:Singleton<NetManager>
{
    Socket socket;//强联网基于socket 进行各种操作
    //管理用户所有集合
    List<Client>allcli=new List<Client>();
    public void Init()
    {
        //初始化  搭水管
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        socket.Bind(new IPEndPoint(IPAddress.Any, 2201));          
        socket.Listen(1000);
        Console.WriteLine("2201的服务器已经构建完毕");
        socket.BeginAccept(OnAccept,null);
       
    }

    private void OnAccept(IAsyncResult ar)
    {
        try
        {
            //结束挂起的连接并返回连接对象(小管)
            Socket socket_cli = socket.EndAccept(ar);
            Console.WriteLine("连接成功");
            //面向对象管理所有连接用户
            Client client = new Client();
            //套数字赋值
            client.socket= socket_cli;
            //加入集合
            allcli.Add(client);
            //再次等待其他用户连接
            socket.BeginAccept(OnAccept, null);
            //用户连接我后要进行通讯 所以我要开启异步接收消息(注意小管接收消息)
            //1.缓存数据 各存个的  2.获取位置 3.获取数据长度 4.值的按位组合 5回调方法 6.要传递的参数(小管传过去)
            socket_cli.BeginReceive(client.data,0,client.data.Length,SocketFlags.None,OnReceive,client);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex); 
        }
    }
    private void OnReceive(IAsyncResult ar)
    {
        try
        {
            //类型转化取到 用户类因为他包含socket
            Client client = ar.AsyncState as Client;
            //小管结束接受消息 返回接受数据长度
            int len= client.socket.EndReceive(ar);  
            if(len>0)
            {
                byte[] rdata = new byte[len];
                Buffer.BlockCopy(client.data,0, rdata, 0, len);
                while(rdata.Length>4)
                {
                    int bodylen=BitConverter.ToInt32(rdata, 0);
                    byte[] bodydata = new byte[bodylen];
                    Buffer.BlockCopy(rdata,4, bodydata, 0, bodylen); 

                    int msgid= BitConverter.ToInt32(bodydata, 0);
                    byte[] info=new byte[bodylen-4];
                    Buffer.BlockCopy(bodydata,4,info, 0, bodylen-4);
                    MesData msg = new MesData();
                    msg.data = info;
                    msg.cli = client;

                    MessageManagerr<MesData>.Instance.OnBroadCast(msgid, msg);

                    int sylen = rdata.Length - 4 - bodylen;
                    byte[] sydata=new byte[sylen];
                    Buffer.BlockCopy(rdata,4+bodylen,sydata, 0, sylen);
                    rdata=sydata;
                }
            }
            client.socket.BeginReceive(client.data, 0, client.data.Length, SocketFlags.None, OnReceive, client);
            //返回的数据其实是由 消息号和内容组成 所以我要瘦到消息号进行 派发
            //数据前四位一定是消息号 因为消息号int类型 占四个字节
            // int magid=BitConverter.ToInt32(client.data,0);
            //剩下的就是消息内容 长度就是接受数据长度-4(消息号长度)
            //  byte[]infodata=new byte[len-4];
            //赋值 数据拷贝
            //Buffer.BlockCopy(client.data,4,infodata,0,len-4);
            //进行消息派发到各个对应业务模块
            //构建对应类
            //MesData msgData = new MesData();
            //msgData.data = infodata;
          //msgData.cli = client;
            //MessageManagerr<MesData>.Instance.OnBroadCast(magid, msgData);
            //再次等待其他用户连接
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
    public void OnSendCli(int id, byte[] data,Client cli)
    {
        int len = data.Length + 4;
        byte[] arr = new byte[0];
        arr = arr.Concat(BitConverter.GetBytes(len)).Concat(BitConverter.GetBytes(id)).Concat(data).ToArray();
        cli.socket.BeginSend(arr, 0, arr.Length, SocketFlags.None, Send, cli);
    }
    private void Send(IAsyncResult ar)
    {
        try
        {
            Client cli = ar.AsyncState as Client;
            cli.socket.EndSend(ar);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值