
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或SslStreamNetworkStream或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