解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# 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ÔÂ*
|