v9.8.2018.0605   由DataReader直接映射实体列表,以支持netstandard的MySql和SQLite,且提升性能
大石头 编写于 2018-06-05 00:45:23
X
using System;
using System.Net.Sockets;
using NewLife.Model;
using NewLife.Net.Proxy;
using NewLife.Net.Sockets;

namespace NewLife.Net
{
    /// <summary>网络服务对象提供者</summary>
    public class NetService //: ServiceContainer<NetService>
    {
        #region 当前静态服务容器
        /// <summary>当前对象容器</summary>
        public static IObjectContainer Container { get { return ObjectContainer.Current; } }
        #endregion

        static NetService()
        {
            var container = Container;
            container.Register<IProxySession, ProxySession>()
                .Register<ISocketServer, TcpServer>(ProtocolType.Tcp)
                .Register<ISocketServer, UdpServer>(ProtocolType.Udp)
                .Register<ISocketClient, TcpSession>(ProtocolType.Tcp)
                .Register<ISocketClient, UdpServer>(ProtocolType.Udp)
                .Register<ISocketSession, TcpSession>(ProtocolType.Tcp)
                //.Register<ISocketSession, UdpServer>(ProtocolType.Udp)
                //.Register<IStatistics, Statistics>()
                .Register<INetSession, NetSession>();
        }

        /// <summary>安装,引发静态构造函数</summary>
        public static void Install() { }

        #region 方法
        /// <summary>根据网络标识创建客户端并连接(对Tcp)</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public static ISocketClient CreateClient(NetUri uri)
        {
            if (uri == null) throw new ArgumentNullException("uri");

            var client = Container.Resolve<ISocketClient>(uri.ProtocolType);
            //if (uri.EndPoint != null)
            //{
            //    if (uri.ProtocolType == ProtocolType.Tcp) client.Connect(uri.EndPoint);
            //}
            client.Remote = uri;

            return client;
        }

        /// <summary>根据网络标识创建客户端会话并连接(对Tcp)</summary>
        /// <param name="uri"></param>
        /// <param name="timeout">数据接收超时时间</param>
        /// <returns></returns>
        public static ISocketSession CreateSession(NetUri uri, int timeout = 3000)
        {
            if (uri == null) throw new ArgumentNullException("uri");

            // 特殊处理UDP
            if (uri.ProtocolType == ProtocolType.Udp)
            {
                var server = Container.Resolve<ISocketServer>(uri.ProtocolType);
                if (server is UdpServer)
                {
                    var udp = server as UdpServer;
                    udp.Timeout = timeout;
                    //udp.Open();
                    //udp.ReceiveAsync();
                    return udp.CreateSession(uri.EndPoint);
                }
            }

            var client = Container.Resolve<ISocketSession>(uri.ProtocolType);
            if (uri.EndPoint != null)
            {
                //if (uri.ProtocolType == ProtocolType.Tcp) (client as ISocketClient).Connect(uri.EndPoint);
                if (client is ISocketClient && !uri.EndPoint.IsAny()) //(client as ISocketClient).Connect(uri.EndPoint);
                {
                    var socketClient = client as ISocketClient;
                    socketClient.Timeout = timeout;
                }
            }
            client.Remote = uri;

            return client;
        }
        #endregion
    }
}