CavemanTcp 為您提供了建置涉及客戶端和伺服器的基於 TCP 的應用程式的最終控制權。
使用CavemanTcp,您可以完全控制資料的讀寫。 CavemanTcp 專為想要明確控制何時讀取或寫入資料或想要在 TCP 之上建置狀態機的人而設計。
重要的:
由於 CavemanTcp 依賴使用應用程式來指定何時讀取或寫入,因此沒有後台執行緒持續監視 TCP 連線的狀態(與 SimpleTcp 和 WatsonTcp 不同)。因此,您應該根據在讀取或寫入過程中可能拋出異常的預期來建立應用程式。
從 v1.3.0 開始,為 .NET Core 和 .NET Framework 新增了 TCP keepalive 支援;不幸的是,.NET Standard 不提供此支持,因此對於使用針對 .NET Standard 的 CavemanTcp 的應用程式來說,它不存在。
Guid
而不是string ipPort
引用ListClients
現在傳回ClientMetadata
的枚舉string ipPort
Send
和Read
方法被標記為過時AddClient
距離連線接受又更近了一步net461
net472
net48
net6.0
net7.0
和net8.0
using CavemanTcp ;
// Instantiate
TcpServer server = new TcpServer ( "127.0.0.1" , 8000 , false , null , null ) ;
server . Logger = Logger ;
// Set callbacks
server . Events . ClientConnected += ( s , e ) =>
{
Console . WriteLine ( "Client " + e . Client . ToString ( ) + " connected to server" ) ;
} ;
server . Events . ClientDisconnected += ( s , e ) =>
{
Console . WriteLine ( "Client " + e . Client . ToString ( ) + " disconnected from server" ) ;
} ;
// Start server
server . Start ( ) ;
// Send [Data] to client at [guid]
Guid guid = Guid . Parse ( "00001111-2222-3333-4444-555566667777" ) ;
WriteResult wr = null ;
wr = server . Send ( guid , "[Data]" ) ;
wr = server . SendWithTimeout ( [ ms ] , guid , "[Data]" ) ;
wr = await server . SendAsync ( guid , "[Data]" ) ;
wr = await server . SendWithTimeoutAsync ( [ ms ] , guid , "[Data]" ) ;
// Receive [count] bytes of data from client at [guid]
ReadResult rr = null ;
rr = server . Read ( guid , [ count ] ) ;
rr = server . ReadWithTimeout ( [ ms ] , guid , count ) ;
rr = await server . ReadAsync ( guid , [ count ] ) ;
rr = await server . ReadWithTimeoutAsync ( [ ms ] , guid , [ count ] ) ;
// List clients
List < ClientMetadata > clients = server . GetClients ( ) . ToList ( ) ;
// Disconnect a client
server . DisconnectClient ( guid ) ;
using CavemanTcp ;
// Instantiate
TcpClient client = new TcpClient ( "127.0.0.1" , 8000 , false , null , null ) ;
client . Logger = Logger ;
// Set callbacks
client . Events . ClientConnected += ( s , e ) =>
{
Console . WriteLine ( "Connected to server" ) ;
} ;
client . Events . ClientDisconnected += ( s , e ) =>
{
Console . WriteLine ( "Disconnected from server" ) ;
} ;
// Connect to server
client . Connect ( 10 ) ;
// Send data to server
WriteResult wr = null ;
wr = client . Send ( "[Data]" ) ;
wr = client . SendWithTimeout ( [ ms ] , "[Data]" ) ;
wr = await client . SendAsync ( "[Data]" ) ;
wr = await client . SendWithTimeoutAsync ( [ ms ] , "[Data]" ) ;
// Read [count] bytes of data from server
ReadResult rr = null ;
rr = client . Read ( [ count ] ) ;
rr = client . ReadWithTimeout ( [ ms ] , count ) ;
rr = await client . ReadAsync ( [ count ] ) ;
rr = await client . ReadWithTimeoutAsync ( [ ms ] , [ count ] ) ;
WriteResult
和ReadResult
包含一個Status
屬性,該屬性指示下列情況之一:
ClientNotFound
- 僅適用於伺服器讀寫操作Success
——操作成功Timeout
- 操作逾時(保留以供日後使用)Disconnected
- 對等方已斷開連接WriteResult
也包括:
BytesWritten
- 寫入套接字的位元組數。 ReadResult
還包括:
BytesRead
- 從套接字讀取的位元組數。DataStream
- 包含所請求資料的MemoryStream
。Data
- DataStream
的byte[]
表示形式。使用此屬性將完全讀取DataStream
到底。 重要的
127.0.0.1
為偵聽器 IP 位址,它將只能接受來自本機主機內部的連線。null
、 *
、 +
或0.0.0.0
作為偵聽器 IP 位址(需要管理員權限才能偵聽任何 IP 位址)當使用任何允許您指定逾時的 API(即SendWithTimeout
、 SendWithTimeoutAsync
、 ReadWithTimeout
和ReadWithTimeoutAsync
)時,如上所述產生的WriteResult
和ReadResult
將指示操作是否逾時。
了解超時表示什麼很重要,更重要的是了解它不代表什麼。
NetworkStream
或SslStream
NetworkStream
或SslStream
讀取指定數量的位元組,則讀取操作將會發生逾時timeoutMs
的有效值為-1
或任何正整數。 -1
表示無逾時,與使用未指定逾時的API相同BytesRead
或BytesWritten
(如果您正在讀取或寫入)。逾時可能發生在操作過程中,因此從故障中恢復非常重要。ReadWithTimeout
,嘗試讀取 50,000 位元組Status == ReadResultStatus.Timeout
的ReadResult
,並將BytesRead
屬性設為 30,000NetworkStream
或SslStream
中等待從 v1.3.0 開始,CavemanTcp 中新增了對 TCP keepalive 的支持,主要是為了解決網路介面關閉、電纜拔出或媒體不可用的問題。需要注意的是,.NET Core 和 .NET Framework 支援 keepalive,但 .NET Standard 不支援 keepalive。截至此版本,.NET Standard 不提供 TCP keepalive 功能。
預設情況下啟用 TCP keepalive。
server . Keepalive . EnableTcpKeepAlives = true ;
server . Keepalive . TcpKeepAliveInterval = 5 ; // seconds to wait before sending subsequent keepalive
server . Keepalive . TcpKeepAliveTime = 5 ; // seconds to wait before sending a keepalive
server . Keepalive . TcpKeepAliveRetryCount = 5 ; // number of failed keepalive probes before terminating connection
關於 TCP keepalive 的一些重要注意事項:
Keepalive.TcpKeepAliveRetryCount
僅適用於.NET Core;對於 .NET Framework,該值強制為 10 特別感謝迄今為止幫助改善圖書館的人們!
@LeaT113 @Kliodna @zzampong @SaintedPsycho @samisil @eatyouroats @CetinOzdil @akselatom @wtarr
需要幫助或有回饋?請在此提出問題!
請參閱 CHANGELOG.md。
特別感謝 VektorPicker 提供的免費 Caveman 圖示:http://www.vectorpicker.com/caveman-icon_490587_47.html