当前位置: 首页 > news >正文

微信机器人网站开发建设企业人力资源网站

微信机器人网站开发,建设企业人力资源网站,wordpress 前台登陆,搜索引擎优化的英文lidgren有几个优点#xff1a;分channel#xff0c;每个channel都有单独的消息队列#xff0c;不互相影响。每个消息可以单独选择使用可靠/不可靠传输。支持内网穿透自带加密算法。前端Unity#xff1a;先贴一张前端使用的网络框架图#xff1a;Lidgren的Github地址#… lidgren有几个优点分channel每个channel都有单独的消息队列不互相影响。每个消息可以单独选择使用可靠/不可靠传输。支持内网穿透自带加密算法。 前端Unity先贴一张前端使用的网络框架图 Lidgren的Github地址https://github.com/lidgren/lidgren-network-gen3在Player Setting中要加上宏定义UNITY连接NetPeerConfiguration config new NetPeerConfiguration (NetworkConfig.CONNECTION_IDENTIFIER);//参数是一个字符串标识前后端一致。config.EnableMessageType (NetIncomingMessageType.ConnectionLatencyUpdated);//监听收发心跳的事件。m_connection new NetClient (config);m_connection.Start ();m_receiveCallBack new SendOrPostCallback (OnReceiveMessage);//收发消息的回调m_connection.RegisterReceivedCallback(m_receiveCallBack, new SynchronizationContext()); m_connection.Connect (ip, port); 断开连接m_connection.Disconnect (); m_connection.UnregisterReceivedCallback (m_receiveCallBack); 发送消息NetOutgoingMessage nm connection.CreateMessage (bytesLength); nm.Write (bytes, 0, bytesLength); m_connection.SendMessage (nm, (NetDeliveryMethod)channelType, channel); NetDeliveryMethod有以下几类UnReliable不可靠传输顺序和丢包都不能保证UnReliableSequence不可靠传输按顺序接收 旧包直接丢弃ReliableUnOrdered可靠传输不保证顺序但是不会丢包ReliableSequence可靠传输和UnReliableSequence但是有一个缓冲窗口超过缓冲范围的包会丢弃ReliableOrdered可靠传输不丢包保证顺序 接收消息void OnReceiveMessage(object state)        {            NetIncomingMessage im;            while ((im m_connection.ReadMessage()) ! null)            {                switch (im.MessageType)                {                case NetIncomingMessageType.ErrorMessage:                case NetIncomingMessageType.WarningMessage:          //处理错误和警告                    break;                case NetIncomingMessageType.DebugMessage:          //debug输出                          break;                case NetIncomingMessageType.VerboseDebugMessage:          //消息重发或丢弃的debug消息                    break;                case NetIncomingMessageType.StatusChanged:          //网络状态变化                    break;                case NetIncomingMessageType.Data:                 //收到消息处理ReceiveMessages (im.ReadBytes (im.LengthBytes), im.LengthBytes);                    break;                case NetIncomingMessageType.ConnectionLatencyUpdated:          //Lidgren收发心跳包后回调                    break;                default:                    break;                }                connection.Recycle(im);            }        }后端DotNetty后端是参照TCPServerSocketChannel和TCPSocketChannel改的。Server的UnSafe可以写一个空类class LidgrenUdpServerUnsafeChannel : AbstractUnsafe        {            public LidgrenUdpServerUnsafeChannel(AbstractChannel channel) : base(channel)            {            }            public override Task ConnectAsync(EndPoint remoteAddress, EndPoint localAddress)            {                return null;            }            public void FinishRead()            {            }        }再实现一个ServerChannelpublic class LidgrenUdpServerChannel : AbstractChannel, IServerChannel    {        public const string CONNECTION_IDENTIFIER xxxxx;        NetServer m_server;        LidgrenChannelConfig m_config;        public NetServer Server        {            get { return m_server; }        }        DictionaryNetConnection, LidgrenUdpChannel m_connectionList new DictionaryNetConnection, LidgrenUdpChannel();        public LidgrenUdpServerChannel()            : base(null)        {            m_config new LidgrenChannelConfig(CONNECTION_IDENTIFIER);            m_server new NetServer(m_config.Config);        }        protected override IChannelUnsafe NewUnsafe()        {            return new LidgrenUdpServerUnsafeChannel(this);        }    ...    }开始监听protected override void DoBind(EndPoint localAddress)        {            m_config.Config.Port ((IPEndPoint)localAddress).Port;            this.m_server.Start();            this.m_server.RegisterReceivedCallback(new System.Threading.SendOrPostCallback(OnRead), new System.Threading.SynchronizationContext());        } OnRead类似客户端的OnReceiveMessage建立/断开连接case NetIncomingMessageType.StatusChanged:                        NetConnectionStatus ns (NetConnectionStatus)im.ReadByte();                        if (ns NetConnectionStatus.Connected)                        {                            LidgrenUdpChannel udpChannel new LidgrenUdpChannel(this, im.SenderConnection);                            Pipeline.FireChannelRead(udpChannel);                            lock (((System.Collections.ICollection)m_connectionList).SyncRoot)                            {                                m_connectionList.Add(im.SenderConnection, udpChannel);                            }                        }                        if (ns NetConnectionStatus.Disconnected)                        {                            lock (((System.Collections.ICollection)m_connectionList).SyncRoot)                            {                                LidgrenUdpChannel channel null;                                if (m_connectionList.TryGetValue(im.SenderConnection, out channel))                                {                                    channel.Pipeline.FireChannelInactive();                                    m_connectionList.Remove(im.SenderConnection);                                }                                                         }                        }              break;接收消息case NetIncomingMessageType.Data:                        LidgrenUdpChannel readChannel null;                        lock (((System.Collections.ICollection)m_connectionList).SyncRoot)                        {                            if (m_connectionList.TryGetValue(im.SenderConnection, out readChannel))                            {                                readChannel.ReadBytes(im.ReadBytes(im.LengthBytes));                            }                        }                      break;对于每一个客户端都有一个单独的channel public class LidgrenUdpChannel : AbstractChannel发送消息protected int DoWriteBytes(IByteBuffer buf)        {            if (!buf.HasArray)            {                throw new NotImplementedException(Only IByteBuffer implementations backed by array are supported.);            }            int sent buf.ReadableBytes;            NetOutgoingMessage msg m_parentChannel.Server.CreateMessage();            msg.Write(buf.Array, buf.ArrayOffset buf.ReaderIndex, buf.ReadableBytes);            m_connection.SendMessage(msg, NetDeliveryMethod.ReliableOrdered, 0);            if (sent 0)            {                buf.SetReaderIndex(buf.ReaderIndex sent);            }            return sent;        }        protected override void DoWrite(ChannelOutboundBuffer input)        {            while (true)            {                object msg input.Current;                if (msg null)                {                    // Wrote all messages.                    break;                }                if (msg is IByteBuffer)                {                    IByteBuffer buf (IByteBuffer)msg;                    int readableBytes buf.ReadableBytes;                    if (readableBytes 0)                    {                        input.Remove();                        continue;                    }                    bool done false;                    long flushedAmount 0;                    int localFlushedAmount this.DoWriteBytes(buf);                    flushedAmount localFlushedAmount;                    if (!buf.IsReadable())                    {                        done true;                    }                    input.Progress(flushedAmount);                    buf.Release();                    if (done)                    {                        input.Remove();                    }                    else                    {                        throw new InvalidOperationException();                    }                }                else                {                    // Should not reach here.                    throw new InvalidOperationException();                }            }        }接收消息  public void ReadBytes(byte[] bytes){            if (!Open)                return;            this.EventLoop.Execute(() { ((LidgrenUdpUnsafe)Unsafe).ReadBytes(bytes); });}UnSafe中public void FinishRead()            {                channel.Read();            }            public void ReadBytes(byte[] bytes)            {                IByteBufferAllocator allocator channel.Allocator;                IRecvByteBufAllocatorHandle allocHandle RecvBufAllocHandle;                IByteBuffer byteBuf allocHandle.Allocate(allocator);                byteBuf.WriteBytes(bytes);                channel.Pipeline.FireChannelRead(byteBuf);                channel.Pipeline.FireChannelReadComplete();                allocHandle.ReadComplete();            }Lidgren不支持ipv6修改方法参照这里https://github.com/SteveProXNA/UnityLidgrenIPv6/tree/master/IPv6原文http://www.cnblogs.com/drashnane/p/6415973.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.yutouwan.com/news/405171/

相关文章:

  • wordpress 微网站游戏登录器列表更新网站建设
  • 马鞍山集团网站设计网站开发质保
  • 北京网站建站公东莞有哪些好的网站建设公司
  • 深圳服装设计学院龙岩优化seo排名
  • 秀米网站怎么做推文免费域名注册免备案
  • 站长工具app官方下载餐饮招商
  • 骄阳房地产网站wordpress 任意下载
  • 惠州网站建设公司哪家好中国建设银行网站首页企业网银
  • 网站开发竞争对手分析做一个简单的管理系统
  • 网站关键词最多几个wordpress兼容mip
  • vps搭建个人网站最好的网站建设机构
  • 福州定制网站开发石家庄手机网站开发
  • 川畅联系 做网站多少钱wamp wordpress安装教程
  • 德州网站建设德州北京做网站多少钱
  • 东光县建设局网站西安旅游攻略自助游
  • 企业顺德网站建设网站源码搭建教程
  • 做网站首页多少钱WordPress修改笔记
  • 重庆网站建设eyouc农资网络销售平台
  • html5网站建设微信运营公司织梦模板app制作开发报价
  • 注册域名建设网站千灯网站建设
  • 什么是外包公司?优化培训课程
  • 长沙微信公众号开发外贸seo培训
  • 可以做砍价活动的网站wordpress 老版本
  • 电子商务模拟实训报告企业网站建设wordpress建站技巧
  • 麻涌镇网站建设手机网站模板设计软件
  • 代账公司杭州seo软件
  • 网站中链接怎么做的安装下载app
  • 网站正在紧急建设中设计师拥有的设计导航
  • 班级网站设计论文前端刚上班感觉工作做不了
  • 网页站点怎么命名百度网站地图制作