解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
21.71 KiB
X
# NewLife.Net ÍøÂç¿Í»§¶ËʹÓÃÊÖ²á ## Ŀ¼ - [¸ÅÊö](/NewLife/X/Blob/dev/Doc/#¸ÅÊö) - [¼Ü¹¹Éè¼Æ](/NewLife/X/Blob/dev/Doc/#¼Ü¹¹Éè¼Æ) - [¿ìËÙ¿ªÊ¼](/NewLife/X/Blob/dev/Doc/#¿ìËÙ¿ªÊ¼) - [ºËÐÄ×é¼þ](/NewLife/X/Blob/dev/Doc/#ºËÐÄ×é¼þ) - [¸ß¼¶¹¦ÄÜ](/NewLife/X/Blob/dev/Doc/#¸ß¼¶¹¦ÄÜ) - [×î¼Ñʵ¼ù](/NewLife/X/Blob/dev/Doc/#×î¼Ñʵ¼ù) - [ÐÔÄÜÓÅ»¯](/NewLife/X/Blob/dev/Doc/#ÐÔÄÜÓÅ»¯) - [³£¼ûÎÊÌâ](/NewLife/X/Blob/dev/Doc/#³£¼ûÎÊÌâ) --- ## ¸ÅÊö NewLife.Net ¿Í»§¶Ë×é¼þÊÇÐÂÉúÃüÍŶӿª·¢µÄ¸ßÐÔÄÜÍøÂçͨÐſ⣬Ìṩ TCP/UDP ¿Í»§¶Ë¹¦ÄÜ£¬Ö§³Ö IPv4 ºÍ IPv6£¬¾ß±¸ÍêÉÆµÄÁ¬½Ó¹ÜÀí¡¢Êý¾ÝÊÕ·¢¡¢ÏûÏ¢´¦ÀíµÈÄÜÁ¦¡£ ### ÌØÐÔ - **¶àЭÒéÖ§³Ö**£ºÍ¬Ê±Ö§³Ö TCP ºÍ UDP ЭÒé - **˫ջ֧³Ö**£ºÍêÕûÖ§³Ö IPv4 ºÍ IPv6 - **¸ßÐÔÄÜ**£º»ùÓÚÒì²½ IO Ä£ÐÍ£¬Ê¹Óà IOCP ʵÏָ߲¢·¢ - **¹ÜµÀ´¦Àí**£ºÁé»îµÄÏûÏ¢¹ÜµÀ£¬Ö§³ÖЭÒé±à½âÂë - **SSL/TLS**£ºÔ­ÉúÖ§³Ö°²È«Á¬½Ó - **ʼþÇý¶¯**£ºÊý¾Ý½ÓÊÕͨ¹ýʼþ֪ͨ£¬¼òµ¥Ò×Óà - **Ḭ̈߳²È«**£ºËùÓкËÐIJÙ×÷²ÉÓÃÔ­×Ó²Ù×÷±£Ö¤Ḭ̈߳²È« - **Ò×À©Õ¹**£ºÁ¼ºÃÀ©Õ¹µÄ¼Ü¹¹Éè¼Æ ### ÊÊÓó¡¾° - ʵʱͨѶ¿Í»§¶Ë - ÓÎÏ·¿Í»§¶Ë - ÎïÁªÍøÉ豸ͨÐÅ - RPC Ô¶³Ìµ÷Óà - ×Ô¶¨ÒåЭÒé¿Í»§¶Ë --- ## ¼Ü¹¹Éè¼Æ ### ºËÐļܹ¹ ``` ©°©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©´ ©¦ Ó¦Óò㠩¦ ©¦ ISocketClient (¿Í»§¶Ë½Ó¿Ú) ©¦ ©¦ ©À©¤©¤ uri.CreateRemote() (ÍÆ¼ö´´½¨·½Ê½) ©¦ ©¦ ©À©¤©¤ ISocketRemote (Ô¶³ÌͨÐŽӿÚ) ©¦ ©¦ ©¸©¤©¤ Pipeline (ÏûÏ¢¹ÜµÀ) ©¦ ©À©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©È ©¦ Socket»ù´¡²ã ©¦ ©¦ SessionBase ©¦ ©¦ ©À©¤©¤ Á¬½Ó¹ÜÀí (Open/Close) ©¦ ©¦ ©À©¤©¤ Êý¾Ý·¢ËÍ (Send/SendMessage) ©¦ ©¦ ©À©¤©¤ Êý¾Ý½ÓÊÕ (Receive/ReceiveAsync/Receivedʼþ) ©¦ ©¦ ©¸©¤©¤ Òì²½IO (SocketAsyncEventArgs) ©¦ ©À©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©È ©¦ ´«Êä²ã ©¦ ©¦ ©À©¤©¤ TcpSession (TCP¿Í»§¶Ë/»á»°) ©¦ ©¦ ©¸©¤©¤ UdpServer (UDP¿Í»§¶Ë/·þÎñ¶Ë) ©¦ ©¸©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¼ ``` ### ½Ó¿Ú¼Ì³Ð¹ØÏµ ``` ISocket // »ù´¡Socket½Ó¿Ú ©À©¤©¤ ISocketRemote // Ô¶³ÌͨÐŽӿڣ¨ÊÕ·¢Êý¾Ý£© ©¦ ©À©¤©¤ ISocketClient // ¿Í»§¶Ë½Ó¿Ú£¨Á¬½Ó¹ÜÀí£© ©¦ ©¦ ©¸©¤©¤ TcpSession // TCP¿Í»§¶ËʵÏÖ ©¦ ©¦ ©¸©¤©¤ UdpServer // UDPʵÏÖ ©¦ ©¸©¤©¤ ISocketSession // ·þÎñ¶Ë»á»°½Ó¿Ú ©¦ ©¸©¤©¤ UdpSession // UDP»á»°ÊµÏÖ ©¸©¤©¤ ISocketServer // ·þÎñ¶Ë½Ó¿Ú ©¸©¤©¤ TcpServer // TCP·þÎñ¶ËʵÏÖ ©¸©¤©¤ UdpServer // UDP·þÎñ¶ËʵÏÖ ``` ### Êý¾ÝÁ÷Ïò **·¢ËÍÁ÷³Ì**£º ``` Send/SendMessage ¡ú Pipeline.Write ¡ú OnSend ¡ú Socket·¢ËÍ ``` **½ÓÊÕÁ÷³Ì**£º ``` Socket½ÓÊÕ ¡ú ProcessEvent ¡ú OnPreReceive ¡ú Pipeline.Read ¡ú OnReceive ¡ú Receivedʼþ ``` --- ## ¿ìËÙ¿ªÊ¼ ### ×î¼òµ¥µÄ TCP ¿Í»§¶Ë£¨ÍƼö·½Ê½£© ```csharp using NewLife; using NewLife.Log; using NewLife.Net; // ´´½¨TCP¿Í»§¶Ë£¨ÍƼö·½Ê½£© var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Log = XTrace.Log; // ´ò¿ªÁ¬½Ó client.Open(); // ·¢ËÍÊý¾Ý client.Send("Hello Server"); // ͬ²½½ÓÊÕÊý¾Ý using var pk = client.Receive(); client.WriteLog("ÊÕµ½£º{0}", pk?.ToStr()); // ¹Ø±ÕÁ¬½Ó client.Close("²âÊÔÍê³É"); ``` ### ×î¼òµ¥µÄ UDP ¿Í»§¶Ë£¨ÍƼö·½Ê½£© ```csharp using NewLife; using NewLife.Log; using NewLife.Net; // ´´½¨UDP¿Í»§¶Ë£¨ÍƼö·½Ê½£© var uri = new NetUri("udp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Log = XTrace.Log; // ·¢ËÍÊý¾Ý£¨UDPÎÞÐèÏÔʽOpen£¬·¢ËÍʱ×Ô¶¯´ò¿ª£© client.Send("Hello UDP"); // ½ÓÊÕÊý¾Ý using var pk = await client.ReceiveAsync(default); client.WriteLog("ÊÕµ½£º{0}", pk?.ToStr()); // ¹Ø±ÕÁ¬½Ó client.Close("²âÊÔÍê³É"); ``` ### ʹÓÃÒì²½½ÓÊÕģʽ ```csharp using NewLife; using NewLife.Log; using NewLife.Net; // ´´½¨¿Í»§¶Ë var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Name = "Сtcp¿Í»§"; client.Log = XTrace.Log; // ¹Ø±ÕĬÈϵÄÒ첽ģʽ£¬Ê¹ÓÃÊÖ¶¯½ÓÊÕ if (client is TcpSession tcp) tcp.MaxAsync = 0; // ½ÓÊÕ·þÎñ¶ËÎÕÊÖ£¨ÄÚ²¿×Ô¶¯½¨Á¢Á¬½Ó£© using var rs = await client.ReceiveAsync(default); client.WriteLog("ÊÕµ½£º{0}", rs?.ToStr()); // ·¢ËÍÊý¾Ý client.WriteLog("·¢ËÍ£ºHello NewLife"); client.Send("Hello NewLife"); // ½ÓÊÕÏìÓ¦ using var rs2 = await client.ReceiveAsync(default); client.WriteLog("ÊÕµ½£º{0}", rs2?.ToStr()); // ¹Ø±ÕÁ¬½Ó client.Close("²âÊÔÍê³É"); ``` ### ʹÓÃʼþÇý¶¯Ä£Ê½ ```csharp using NewLife; using NewLife.Log; using NewLife.Net; var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Log = XTrace.Log; // Á¬½Ó´ò¿ªÊ¼þ client.Opened += (s, e) => XTrace.WriteLine("ÒÑÁ¬½Ó"); // Á¬½Ó¹Ø±Õʼþ client.Closed += (s, e) => XTrace.WriteLine("ÒѶϿª"); // Êý¾Ý½ÓÊÕʼþ client.Received += (s, e) => { XTrace.WriteLine("ÊÕµ½ [{0}]: {1}", e.Packet?.Length, e.Packet?.ToStr()); }; // ´íÎóʼþ client.Error += (s, e) => { XTrace.WriteLine("´íÎó [{0}]: {1}", e.Action, e.Exception.Message); }; // ´ò¿ªÁ¬½Ó£¨»á×Ô¶¯¿ªÊ¼Òì²½½ÓÊÕ£© client.Open(); // ·¢ËÍÊý¾Ý client.Send("Hello"); // ±£³ÖÔËÐÐ Console.ReadLine(); client.Close("Exit"); ``` --- ## ºËÐÄ×é¼þ ### NetUri - ÍøÂçµØÖ· NetUri ÓÃÓÚÃèÊöÍøÂçµØÖ·£¬Ö§³ÖЭÒé¡¢Ö÷»ú¡¢¶Ë¿Ú£¬ÊÇ´´½¨¿Í»§¶ËµÄÈë¿Ú¡£ ```csharp // ´Ó×Ö·û´®½âÎö£¨ÍƼö£© var uri = new NetUri("tcp://127.0.0.1:12345"); var uri = new NetUri("udp://192.168.1.100:8080"); var uri = new NetUri("tcp://example.com:443"); // Ö±½Ó¹¹Ôì var uri = new NetUri(NetType.Tcp, IPAddress.Loopback, 12345); var uri = new NetUri(NetType.Udp, "192.168.1.100", 8080); // »ñÈ¡ÊôÐÔ var type = uri.Type; // ЭÒéÀàÐÍ var host = uri.Host; // Ö÷»úÃû var address = uri.Address; // IPµØÖ· var port = uri.Port; // ¶Ë¿Ú var endpoint = uri.EndPoint; // IPEndPoint // ÓòÃû½âÎö var addresses = uri.GetAddresses(); // »ñÈ¡ËùÓÐIP var endpoints = uri.GetEndPoints(); // »ñÈ¡ËùÓÐÖÕ½áµã // ´´½¨¿Í»§¶Ë£¨ÍƼö·½Ê½£© var client = uri.CreateRemote(); ``` ### CreateRemote - ´´½¨¿Í»§¶Ë `CreateRemote()` ÊÇ NetUri µÄÀ©Õ¹·½·¨£¬¸ù¾ÝЭÒéÀàÐÍ×Ô¶¯´´½¨¶ÔÓ¦µÄ¿Í»§¶ËʵÀý¡£ ```csharp // TCP¿Í»§¶Ë var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); // ·µ»Ø TcpSession // UDP¿Í»§¶Ë var uri = new NetUri("udp://127.0.0.1:12345"); var client = uri.CreateRemote(); // ·µ»Ø UdpServer // HTTP/HTTPS£¨×Ô¶¯ÆôÓÃSSL£© var uri = new NetUri("http://example.com:443"); var client = uri.CreateRemote(); // ·µ»Ø TcpSession with SSL // WebSocket var uri = new NetUri("ws://127.0.0.1:8080"); var client = uri.CreateRemote(); // ·µ»Ø WebSocketClient ``` ### ISocketClient - ¿Í»§¶Ë½Ó¿Ú ËùÓпͻ§¶Ë¶¼ÊµÏÖ `ISocketClient` ½Ó¿Ú£¬ÌṩͳһµÄ²Ù×÷·½Ê½¡£ ```csharp var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); // »ù±¾ÊôÐÔ client.Name = "MyClient"; // ¿Í»§¶ËÃû³Æ£¬ÓÃÓÚÈÕÖ¾ client.Timeout = 5000; // ³¬Ê±Ê±¼ä£¨ºÁÃ룩 client.Log = XTrace.Log; // ÈÕÖ¾¶ÔÏó // Á¬½Ó¹ÜÀí client.Open(); // ͬ²½´ò¿ª await client.OpenAsync(); // Òì²½´ò¿ª client.Close("reason"); // ͬ²½¹Ø±Õ await client.CloseAsync("reason"); // Òì²½¹Ø±Õ var active = client.Active; // Á¬½Ó״̬ // Êý¾Ý·¢ËÍ client.Send(data); // ·¢ËÍ×Ö½ÚÊý×é client.Send("Hello"); // ·¢ËÍ×Ö·û´®£¨À©Õ¹·½·¨£© client.Send(packet); // ·¢ËÍÊý¾Ý°ü // Êý¾Ý½ÓÊÕ using var pk = client.Receive(); // ͬ²½½ÓÊÕ using var pk = await client.ReceiveAsync();// Òì²½½ÓÊÕ // ʼþ client.Opened += (s, e) => { }; // ´ò¿ªÊ¼þ client.Closed += (s, e) => { }; // ¹Ø±Õʼþ client.Received += (s, e) => { }; // ½ÓÊÕʼþ client.Error += (s, e) => { }; // ´íÎóʼþ ``` ### TcpSession - TCP¿Í»§¶Ë TcpSession ÊÇÔöÇ¿µÄTCP¿Í»§¶Ë£¬Ö§³ÖSSL/TLS°²È«Á¬½Ó¡£ #### »ù±¾ÊôÐÔÅäÖà ```csharp var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); // ת»»Îª¾ßÌåÀàÐÍÒÔ·ÃÎʸü¶àÊôÐÔ if (client is TcpSession tcp) { // TCPÑ¡Ïî tcp.NoDelay = true; // ½ûÓÃNagleËã·¨£¨µÍÑÓ³Ù£© tcp.KeepAliveInterval = 30; // KeepAlive¼ä¸ô£¨Ã룩 // SSLÅäÖà tcp.SslProtocol = SslProtocols.Tls12; // SSLЭÒé°æ±¾ tcp.Certificate = cert; // ¿Í»§¶ËÖ¤Ê飨¿ÉÑ¡£© // ½ÓÊÕÅäÖà tcp.MaxAsync = 1; // ×î´ó²¢ÐнÓÊÕÊý£¬TCPĬÈÏ1 tcp.BufferSize = 8192; // ½ÓÊÕ»º³åÇø´óС // ÈÕÖ¾ÅäÖà tcp.LogSend = true; // ¼Ç¼·¢ËÍÈÕÖ¾ tcp.LogReceive = true; // ¼Ç¼½ÓÊÕÈÕÖ¾ tcp.LogDataLength = 64; // ÈÕÖ¾Êý¾Ý³¤¶È // ×·×ÙÅäÖà tcp.Tracer = tracer; // APM×·×ÙÆ÷ } client.Open(); ``` #### Êý¾Ý·¢ËÍ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Open(); // ·¢ËÍ×Ö½ÚÊý×é var sent = client.Send(new Byte[] { 0x01, 0x02, 0x03 }); var sent = client.Send(data, offset, count); // ·¢ËÍArraySegment var sent = client.Send(new ArraySegment<Byte>(data, 0, 10)); // ·¢ËÍSpan£¨¸ßÐÔÄÜ£¬Á㿽±´£© ReadOnlySpan<Byte> span = stackalloc Byte[100]; var sent = client.Send(span); // ·¢ËÍÊý¾Ý°ü var packet = new ArrayPacket(data); var sent = client.Send(packet); // ʹÓÃÀ©Õ¹·½·¨·¢ËÍ×Ö·û´® var sent = client.Send("Hello World"); var sent = client.Send("ÖÐÎÄ", Encoding.UTF8); // ʹÓÃÀ©Õ¹·½·¨·¢ËÍÁ÷ using var stream = File.OpenRead("data.bin"); var sent = client.Send(stream); ``` #### Êý¾Ý½ÓÊÕ ```csharp var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); // ¹Ø±ÕÒì²½½ÓÊÕ£¬Ê¹ÓÃÊÖ¶¯½ÓÊÕģʽ if (client is TcpSession tcp) tcp.MaxAsync = 0; client.Open(); // ͬ²½½ÓÊÕ£¨×èÈû£© using var pk = client.Receive(); if (pk != null) { var data = pk.ToArray(); var str = pk.ToStr(); } // Òì²½½ÓÊÕ using var pk = await client.ReceiveAsync(); // ´øÈ¡ÏûÁîÅÆ using var cts = new CancellationTokenSource(5000); using var pk = await client.ReceiveAsync(cts.Token); // À©Õ¹·½·¨£º½ÓÊÕ×Ö·û´® var str = client.ReceiveString(); // ʼþÇý¶¯½ÓÊÕ£¨ÍƼö£¬ÐèÒª±£³Ö MaxAsync >= 1£© client.Received += (s, e) => { var pk = e.Packet; // ԭʼÊý¾Ý°ü var msg = e.Message; // ¾­¹ÜµÀ½âÂëºóµÄÏûÏ¢ var remote = e.Remote; // Ô¶³ÌµØÖ· var local = e.Local; // ±¾µØµØÖ· }; ``` ### UdpServer - UDP¿Í»§¶Ë/·þÎñ¶Ë UdpServer ¼È¿ÉÒÔ×÷Ϊ·þÎñ¶ËÒ²¿ÉÒÔ×÷Ϊ¿Í»§¶ËʹÓᣠ#### ×÷Ϊ¿Í»§¶ËʹÓà ```csharp // ´´½¨UDP¿Í»§¶Ë var uri = new NetUri("udp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Log = XTrace.Log; // ¹Ø±ÕÒì²½½ÓÊÕ£¬Ê¹ÓÃÊÖ¶¯½ÓÊÕģʽ if (client is UdpServer udp) udp.MaxAsync = 0; // ·¢ËÍÊý¾Ý£¨UDPÎÞÐèÏÔʽOpen£¬·¢ËÍʱ×Ô¶¯´ò¿ª£© client.Send("Hello UDP"); // ½ÓÊÕÊý¾Ý using var pk = await client.ReceiveAsync(default); client.WriteLog("ÊÕµ½£º{0}", pk?.ToStr()); // ¹Ø±ÕÁ¬½Ó client.Close("²âÊÔÍê³É"); ``` #### UDP·þÎñ¶ËÅäÖà ```csharp var uri = new NetUri("udp://0.0.0.0:12345"); var server = uri.CreateRemote() as UdpServer; // ·þÎñ¶ËÅäÖà server.Port = 12345; // ±¾µØ¶Ë¿Ú server.ReuseAddress = true; // µØÖ·ÖØÓà server.Loopback = false; // ÊÇ·ñ½ÓÊÕ»·»ØÊý¾Ý server.SessionTimeout = 20 * 60; // »á»°³¬Ê±Ê±¼ä£¨Ã룩 server.MaxAsync = Environment.ProcessorCount * 16 / 10; // UDPĬÈÏCPU*1.6 server.BufferSize = 8192; // лỰʼþ server.NewSession += (s, e) => { var session = e.Session as UdpSession; XTrace.WriteLine("лỰ£º{0}", session.Remote); // »á»°Êý¾Ý½ÓÊÕ session.Received += (ss, ee) => { XTrace.WriteLine("»á»° {0} ÊÕµ½£º{1}", session.ID, ee.Packet?.ToStr()); session.Send("Reply"); }; }; server.Open(); ``` ### Pipeline - ÏûÏ¢¹ÜµÀ ¹ÜµÀÓÃÓÚЭÒé±à½âÂ룬֧³ÖÁ´Ê½´¦Àí¡£ #### Ìí¼Ó´¦ÀíÆ÷ ```csharp using NewLife.Net.Handlers; var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); // ʹÓÃÀ©Õ¹·½·¨Ìí¼Ó´¦ÀíÆ÷ client.Add<StandardCodec>(); // ±ê×¼±à½âÂëÆ÷£¨4×Ö½ÚÍ·²¿+Êý¾Ý£© client.Add<JsonCodec>(); // JSON±à½âÂëÆ÷ // »òÕßÖ±½ÓÉèÖÃPipeline client.Pipeline = new Pipeline(); client.Pipeline.Add(new StandardCodec()); client.Pipeline.Add(new JsonCodec()); client.Open(); ``` #### ±ê×¼±à½âÂëÆ÷ StandardCodec ʹÓà 4 ×Ö½ÚÍ·²¿±êʶÊý¾Ý³¤¶È£¬×Ô¶¯´¦ÀíÕ³°ü/²ð°ü¡£ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Add<StandardCodec>(); client.Open(); // ·¢ËÍÏûÏ¢£¨×Ô¶¯Ìí¼ÓÍ·²¿£© client.SendMessage(new ArrayPacket(data)); // ½ÓÊÕʱ×Ô¶¯½âÎö client.Received += (s, e) => { // e.Message ÊǽâÂëºóµÄÏûÏ¢ if (e.Message is IPacket pk) { var data = pk.ToArray(); } }; ``` #### ×Ô¶¨Òå´¦ÀíÆ÷ ```csharp public class MyCodec : Handler { public override Object? Read(IHandlerContext context, Object message) { // ½âÂë´¦Àí£¨½ÓÊÕʱ£© if (message is IPacket pk) { var myMsg = Decode(pk); return context.FireRead(myMsg); } return base.Read(context, message); } public override Object? Write(IHandlerContext context, Object message) { // ±àÂë´¦Àí£¨·¢ËÍʱ£© if (message is MyMessage msg) { var pk = Encode(msg); return context.FireWrite(pk); } return base.Write(context, message); } } // ʹÓÃ×Ô¶¨Òå´¦ÀíÆ÷ var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Add(new MyCodec()); ``` --- ## ¸ß¼¶¹¦ÄÜ ### SSL/TLS °²È«Á¬½Ó ```csharp // ¿Í»§¶ËSSL£¨²»ÑéÖ¤·þÎñ¶ËÖ¤Ê飩 var uri = new NetUri("tcp://127.0.0.1:443"); var client = uri.CreateRemote(); if (client is TcpSession tcp) { tcp.SslProtocol = SslProtocols.Tls12 | SslProtocols.Tls13; } client.Open(); // ¿Í»§¶ËSSL£¨Ê¹Óÿͻ§¶ËÖ¤Ê飩 var clientCert = new X509Certificate2("client.pfx", "password"); var uri = new NetUri("tcp://127.0.0.1:443"); var client = uri.CreateRemote(); if (client is TcpSession tcp) { tcp.SslProtocol = SslProtocols.Tls12; tcp.Certificate = clientCert; // ¿Í»§¶ËÖ¤Êé } client.Open(); ``` ### ÏûÏ¢ÇëÇóÏìӦģʽ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Add<StandardCodec>(); client.Open(); // ·¢ËÍÏûÏ¢²¢µÈ´ýÏìÓ¦ var response = await client.SendMessageAsync(request); // ´ø³¬Ê±µÄÇëÇóÏìÓ¦ using var cts = new CancellationTokenSource(5000); var response = await client.SendMessageAsync(request, cts.Token); // ·¢ËÍÏûÏ¢²»µÈ´ýÏìÓ¦ var sent = client.SendMessage(message); ``` ### À©Õ¹Êý¾Ý´æ´¢ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); // ʹÓÃË÷ÒýÆ÷´æ´¢Êý¾Ý client["userId"] = 12345; client["loginTime"] = DateTime.Now; // ¶ÁÈ¡Êý¾Ý var userId = (Int32)client["userId"]; var loginTime = (DateTime)client["loginTime"]; // ʹÓà Items ×Öµä client.Items["userData"] = new UserData(); var userData = client.Items["userData"] as UserData; ``` ### APM ÐÔÄÜ×·×Ù ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Tracer = tracer; // APM×·×ÙÆ÷ // ×·×ٵIJÙ×÷°üÀ¨£º // - net:{Name}:Open ´ò¿ªÁ¬½Ó // - net:{Name}:Close ¹Ø±ÕÁ¬½Ó // - net:{Name}:Send ·¢ËÍÊý¾Ý // - net:{Name}:Receive ½ÓÊÕÊý¾Ý // - net:{Name}:SendMessage ·¢ËÍÏûÏ¢ // - net:{Name}:SendMessageAsync Òì²½·¢ËÍÏûÏ¢ ``` --- ## ×î¼Ñʵ¼ù ### 1. ×ÊÔ´¹ÜÀí ```csharp // ʹÓÃusingÈ·±£×ÊÔ´ÊÍ·Å var uri = new NetUri("tcp://127.0.0.1:12345"); using var client = uri.CreateRemote(); client.Open(); // ... ʹÓÿͻ§¶Ë // ×Ô¶¯µ÷ÓÃDispose // »òÕßÊÖ¶¯¹ÜÀí var client = uri.CreateRemote(); try { client.Open(); // ... ʹÓÿͻ§¶Ë } finally { client.Close("Done"); client.Dispose(); } ``` ### 2. Òì³£´¦Àí ```csharp var client = new NetUri("tcp://192.0.2.1:12345").CreateRemote(); // ×¢²á´íÎóʼþ client.Error += (s, e) => { XTrace.WriteLine("´íÎó [{0}]: {1}", e.Action, e.Exception.Message); }; try { client.Timeout = 5000; client.Open(); } catch (TimeoutException ex) { XTrace.WriteLine("Á¬½Ó³¬Ê±£º{0}", ex.Message); } catch (SocketException ex) { XTrace.WriteLine("Socket´íÎó£º{0}", ex.SocketErrorCode); } ``` ### 3. Á¬½Ó״̬¼ì²é ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); // ·¢ËÍǰ¼ì²éÁ¬½Ó״̬ if (!client.Active) { client.Open(); } // »òÕßʹÓÃOpenµÄÃݵÈÐÔ client.Open(); // Èç¹ûÒÑÁ¬½Ó£¬Ö±½Ó·µ»Øtrue client.Send(data); ``` ### 4. ÈÕÖ¾ÅäÖà ```csharp // Éú²ú»·¾³ var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Log = XTrace.Log; client.LogSend = false; // ¹Ø±Õ·¢ËÍÈÕÖ¾ client.LogReceive = false; // ¹Ø±Õ½ÓÊÕÈÕÖ¾ // µ÷ÊÔ»·¾³ var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Log = XTrace.Log; client.LogSend = true; // ¿ªÆô·¢ËÍÈÕÖ¾ client.LogReceive = true; // ¿ªÆô½ÓÊÕÈÕÖ¾ if (client is SessionBase sb) sb.LogDataLength = 256; // ÈÕÖ¾Êý¾Ý³¤¶È ``` ### 5. ÐÄÌø±£»î ```csharp var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); if (client is TcpSession tcp) { tcp.KeepAliveInterval = 60; // ϵͳ¼¶KeepAlive£¬60Ãë } client.Open(); // Ó¦Óü¶ÐÄÌø var timer = new TimerX(async state => { if (client.Active) { client.Send("ping"u8.ToArray()); } }, null, 30_000, 30_000); // 30Ãë·¢ËÍÒ»´Î ``` ### 6. ¶ÏÏßÖØÁ¬ ```csharp var uri = new NetUri("tcp://127.0.0.1:12345"); var client = uri.CreateRemote(); client.Closed += async (s, e) => { XTrace.WriteLine("Á¬½Ó¶Ï¿ª£¬³¢ÊÔÖØÁ¬..."); // ÑÓ³ÙÖØÁ¬ await Task.Delay(3000); for (var i = 0; i < 5; i++) { try { if (client.Open()) { XTrace.WriteLine("ÖØÁ¬³É¹¦"); return; } } catch (Exception ex) { XTrace.WriteLine("ÖØÁ¬Ê§°Ü£º{0}", ex.Message); } await Task.Delay(3000 * (i + 1)); // µÝÔöÑÓ³Ù } XTrace.WriteLine("ÖØÁ¬Ê§°Ü£¬ÒÑ·ÅÆú"); }; ``` --- ## ÐÔÄÜÓÅ»¯ ### 1. ʹÓÃSpan·¢ËÍ ```csharp // ¸ßÐÔÄÜ·¢ËÍ£¬±ÜÃâÊý×é·ÖÅä ReadOnlySpan<Byte> data = stackalloc Byte[100]; // ... Ìî³äÊý¾Ý client.Send(data); ``` ### 2. »º³åÇøÓÅ»¯ ```csharp // ¸ù¾Ýʵ¼ÊÊý¾Ý´óСµ÷Õû»º³åÇø var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); if (client is SessionBase sb) { sb.BufferSize = 64 * 1024; // 64KB£¬ÊʺϴóÊý¾Ý´«Êä } ``` ### 3. ½ûÓÃNagleËã·¨ ```csharp // ¶ÔÓÚʵʱÐÔÒªÇó¸ßµÄ³¡¾° var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); if (client is TcpSession tcp) { tcp.NoDelay = true; // ½ûÓÃNagleËã·¨£¬¼õÉÙÑÓ³Ù } ``` ### 4. ÅúÁ¿·¢ËÍ ```csharp // ʹÓÃÊý¾Ý°üÁ´Ê½·¢ËÍ var pk1 = new ArrayPacket(data1); var pk2 = new ArrayPacket(data2); pk1.Append(pk2); // Á´Ê½Á¬½Ó client.Send(pk1); // Ò»´Îϵͳµ÷Ó÷¢ËÍÈ«²¿ ``` ### 5. Òì²½½ÓÊÕ ```csharp // ʹÓÃʼþÇý¶¯Ä£Ê½£¬±ÜÃâ×èÈû var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Received += (s, e) => { // ÔÚIOÏß³ÌÖ±½Ó´¦Àí£¬¸ßЧ ProcessData(e.Packet); }; client.Open(); // Openºó×Ô¶¯¿ªÊ¼Òì²½½ÓÊÕ ``` --- ## ³£¼ûÎÊÌâ ### Q: ÈçºÎ´¦ÀíÕ³°ü/²ð°ü£¿ A: ʹÓà StandardCodec »ò×Ô¶¨ÒåЭÒé´¦ÀíÆ÷¡£ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Add<StandardCodec>(); // 4×Ö½ÚÍ·²¿+Êý¾Ý ``` ### Q: Á¬½Ó³¬Ê±Ôõô´¦Àí£¿ A: ÉèÖà Timeout ÊôÐÔ£¬²¢²¶»ñ TimeoutException¡£ ```csharp var client = new NetUri("tcp://192.0.2.1:12345").CreateRemote(); client.Timeout = 5000; // 5Ã볬ʱ try { client.Open(); } catch (TimeoutException) { XTrace.WriteLine("Á¬½Ó³¬Ê±"); } ``` ### Q: ÈçºÎ»ñÈ¡±¾µØ°ó¶¨µØÖ·£¿ A: ͨ¹ý Local ÊôÐÔ»ñÈ¡¡£ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Open(); XTrace.WriteLine("±¾µØµØÖ·£º{0}", client.Local); XTrace.WriteLine("±¾µØ¶Ë¿Ú£º{0}", client.Port); ``` ### Q: UDPÈçºÎÖ¸¶¨±¾µØ¶Ë¿Ú£¿ A: ÉèÖà Port ÊôÐÔ¡£ ```csharp var client = new NetUri("udp://127.0.0.1:12345").CreateRemote(); client.Port = 8888; // °ó¶¨±¾µØ8888¶Ë¿Ú ``` ### Q: ÈçºÎ·¢ËÍÎļþ£¿ A: ʹÓÃÀ©Õ¹·½·¨¡£ ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); client.Open(); // Á÷ʽ·¢ËÍ using var stream = File.OpenRead("data.bin"); client.Send(stream); // ·Ö°ü·¢ËÍ£¨ÐèÒªStandardCodec£© client.Add<StandardCodec>(); client.SendFile("data.bin"); ``` ### Q: ÈçºÎ´¦ÀíÓòÃû¶àIP£¿ A: NetUri ×Ô¶¯´¦ÀíÓòÃû½âÎö£¬CreateRemote() ´´½¨µÄ¿Í»§¶Ë»á×Ô¶¯³¢ÊÔËùÓÐIP¡£ ```csharp var uri = new NetUri("tcp://example.com:80"); var addresses = uri.GetAddresses(); // »ñÈ¡ËùÓÐIP // ¿Í»§¶Ë»á×Ô¶¯¹ÊÕÏ×ªÒÆ var client = uri.CreateRemote(); client.Open(); // ×Ô¶¯³¢ÊÔËùÓÐIPÖ±µ½Á¬½Ó³É¹¦ ``` ### Q: ΪʲôÊÕ²»µ½Êý¾Ý£¿ A: ¼ì²éÒÔϼ¸µã£º 1. È·±£µ÷ÓÃÁË `Open()` ·½·¨ 2. Èç¹ûʹÓÃʼþÇý¶¯£¬È·±£ `MaxAsync >= 1` 3. Èç¹ûʹÓÃÊÖ¶¯½ÓÊÕ£¬ÉèÖà `MaxAsync = 0` 4. ¼ì²é·À»ðǽÉèÖà 5. ¼ì²é·þÎñ¶ËÊÇ·ñÕýÈ··¢ËÍÊý¾Ý ```csharp var client = new NetUri("tcp://127.0.0.1:12345").CreateRemote(); // ʼþÇý¶¯Ä£Ê½£¨Ä¬ÈÏ£© client.Received += (s, e) => { XTrace.WriteLine("ÊÕµ½Êý¾Ý£º{0}×Ö½Ú", e.Packet?.Length); }; client.Open(); // ±ØÐëµ÷ÓÃOpen // »òÕßÊÖ¶¯½ÓÊÕģʽ if (client is TcpSession tcp) tcp.MaxAsync = 0; client.Open(); using var pk = await client.ReceiveAsync(default); ``` ### Q: ÈçºÎʵÏֹ㲥£¿ A: ʹÓÃUDP¹ã²¥µØÖ·¡£ ```csharp var client = new NetUri("udp://255.255.255.255:12345").CreateRemote(); client.Open(); client.Send("Broadcast message"); ``` --- ## ¸½Â¼ ### ¹Ø¼üÀàÐÍËÙ²é | ÀàÐÍ | ˵Ã÷ | |------|------| | `NetUri` | ÍøÂçµØÖ·£¬Ö§³ÖЭÒé/Ö÷»ú/¶Ë¿Ú | | `CreateRemote()` | NetUriÀ©Õ¹·½·¨£¬´´½¨¿Í»§¶Ë | | `TcpSession` | TCP¿Í»§¶Ë£¬Ö§³ÖSSL/TLS | | `UdpServer` | UDP¿Í»§¶Ë/·þÎñ¶Ë | | `UdpSession` | UDP»á»°£¨·þÎñ¶ËʹÓã© | | `SessionBase` | »á»°»ùÀ࣬·âװͨÓù¦ÄÜ | | `ISocketClient` | ¿Í»§¶Ë½Ó¿Ú | | `ISocketRemote` | Ô¶³ÌͨÐÅ½Ó¿Ú | | `IPipeline` | ÏûÏ¢¹ÜµÀ½Ó¿Ú | | `Handler` | ¹ÜµÀ´¦ÀíÆ÷»ùÀà | | `StandardCodec` | ±ê×¼±à½âÂëÆ÷ | ### Ïà¹Ø×ÊÔ´ - GitHub: https://github.com/NewLifeX/X - Gitee: https://gitee.com/NewLifeX/X - Îĵµ: https://newlifex.com --- *±¾Îĵµ¸üУº2025Äê7ÔÂ*