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