v6.0.x
- Remove unsupported frameworks
- Async version of
SyncMessageReceived
callback - Moving usings inside namespace
- Remove obsolete methods
- Mark non-async APIs obsolete
- Modified test projects to use async
- Ensured background tasks honored cancellation tokens
v5.1.x
- Strong name signing
- Better exception logging
- Set
Settings.NoDelay
totrue
by default (disabling Nagle's algorithm)
v5.0.x
- Breaking changes
- Migrate from using
IpPort
as a client key to usingGuid
- Removal of
Newtonsoft.Json
as a dependency - Separate
WatsonMessageBuilder
class to reduce code bloat ClientMetadata
now includesGuid
ListClients
now returns list ofClientMetadata
instead of list ofIpPort
- Mark
Send*
methods that useipPort
as obsolete (pending removal in future release) - Restrict message metadata dictionary to
<string, object>
- Targeting for .NET 7.0
v4.8.11
- TLS extensions, thank you @cee-sharp
v4.8.10
- Bugfix, authentication failure now disconnects clients and propagates the correct reason (thank you @Jyck)
v4.8.9
- Added optional parameter
offset
toSend
andSendAsync
methods that usebyte[]
data (thank you @pha3z)
v4.8.8
- Move listener start into
Start()
method (thank you @avoitenko)
v4.8.7
- Bugfix, timeout values for .NET Framework now properly handled as milliseconds (thank you @zsolt777)
v4.8.6
- Specify the client port by setting
Settings.LocalPort
(0, 1024-65535 are valid, where 0 is auto-assigned)
v4.8.0
- Breaking change; log messages now include a
Severity
parameter - TCP keepalives moved to the socket instead of the listener
v4.7.1
- Breaking change; TCP keepalives now disabled by default due to incompatibility and problems on some platforms
v4.7.0
- Breaking changes
- Consolidated connection/disconnection event arguments
- Consolidated message/stream received event arguments
- Aligned disconnection reason with message status
v4.6.0.0
- More changes based on suggestions from @syntacs and @MartyIX
- Consolidated
Send
constructors with optional params to reduce complexity - Optional
CancellationToken
parameters for asyncSend
methods - Use of
ConfigureAwait
for better reliability
v4.5.0.1
- Excellent changes and recommendations led by @syntacs for reliability
- Better coordination between Dispose and server Stop and client Disconnect
- Exception handling in server and client event handlers as well as callbacks
v4.4.0
- Breaking changes; header name fields have been reduced
- Performance improvements
- Elimination of sending unnecessary headers
- Thank you @broms95!
v4.3.0
- Breaking changes
- Retarget to include .NET Core 3.1 (previously .NET Framework 4.6.1 and .NET Standard 2.1 only)
- Added support for TCP keepalives for .NET Framework and .NET Core (.NET Standard does not have such facilities)
- Consolidated settings into separate classes
v4.2.0
- Breaking changes
- Introduced
WatsonStream
class to prevent stream consumers from reading into the next message's header MaxProxiedStreamSize
property to dictate whether data is sent toStreamReceived
in a newMemoryStream
or the underlying data stream is sent- Minor refactor and removal of compression
v4.1.12
- Fix for ClientMetadata.Dispose
v4.1.11
- Fix to order of ServerConnected and starting DataReceiver in WatsonTcpClient (thank you @ozrecsec)
v4.1.10
- Minor fixes to synchronous message expiration (thank you @karstennilsen)
v4.1.9
- Fix for being unable to disconnect a client from ClientConnected (thank you @motridox)
v4.1.8
- Fix for message expiration (thank you @karstennilsen)
v4.1.7
- AuthenticationRequested, AuthenticationSucceeded, and AuthenticationFailed events in WatsonTcpServer
v4.1.6
- Added SenderTimestamp to sync messages and derived expiration based on difference in sender vs receiver perception of time (thank you @karstennilsen)
v4.1.5
- Fix for synchronous request timeout leaving message data in the underlying stream (thank you @ozrecsec!)
v4.1.4
- Minor internal refactor
v4.1.3
- Fix for issue: compression with SSL enabled causes deserialization exceptions; not recommended for use
- Minor refactor
v4.1.2
- New constructor for SSL, taking certificate as parameter (thank you @NormenSchwettmann)
- Known issue: compression with SSL enabled causes deserialization exceptions; not recommended for use
v4.1.1
- Bugfix for disconnect scenarios causing the next message headers to be read as part of the prior message
- Known issue: compression with SSL enabled causes deserialization exceptions; not recommended for use
v4.1.0
- Compression of message data using either GZip or Deflate (thanks @developervariety!)
- Message data is now a property that fully reads the underlying stream
- Internal code refactoring to better follow DRY principles (SendHeaders, SendDataStream, etc)
- Reduce log verbosity on disconnect
v4.0.2
- Bugfix (thank you @ozrecsec!) for ClientDisconnected firing too early
v4.0.1
- Bugfixes (thank you @ozrecsec!) for DateTime serialization
v4.0.0
- Overhaul to internal framing, refer to
FRAMING.md
- Fixes to
Test.Throughput
projects (incorrectly reporting statistics)
v3.1.4
- Better handling for cases where no message/stream event handler is set
v3.1.3
- Fix synchronous messaging expiration bug
v3.1.2
- Fix DateTime string format
v3.1.1
- APIs to support sending async or sync (send-and-wait) messages with a metadata dictionary and no data
- Better handling of null input when sending data
v3.1.0
- Added support for synchronous messaging, i.e. send and wait for a response (see
SendAndWait
methods) with timeouts. See the updated examples below or refer to theTest.Client
andTest.Server
project for examples - Consolidated Logger for client, server, and messages
Debug
is nowDebugMessages
- Minor internal refactor
v3.0.3
- Now supports serialized metadata sizes (i.e. calculated after serialization of your dictionary) of up to 99,999,999 bytes
v3.0.2
.Data
property in bothStreamReceivedFromClientEventArgs
andStreamReceivedFromServerEventArgs
.
v3.0.1
- Bugfix in pre-shared key authentication
v3.0.0
- Breaking changes; move from Func-based callbacks to Event
- Added MaxConnections and Connection values in WatsonTcpServer
v2.2.2
- Added Statistics object.
v2.2.1
- Added Logger method to both WatsonTcpServer and WatsonTcpClient (thanks @crushedice)
v2.2.0
- Add support for sending and receiving messages with metadata
Dictionary<object, object>
- New callbacks for receiving messages with metadata: MessageReceivedWithMetadata and StreamReceivedWithMetadata -
- New callbacks for sending messages with metadata (overloads on existing methods added)
- Now dependent upon Newtonsoft.Json as metadata must be serialized; only serializable types are supported in metadata
v2.1.7
- Add support for Send(string) and SendAsync(string)
v2.1.6
- ListClients now returns IEnumerable (thanks @pha3z!)
v2.1.5
- Fix for larger message cases (thanks @mikkleini!)
v2.1.4
- Minor breaking change; ClientDisconnect now includes DisconnectReason to differentiate between normal, kicked, or timeout disconnections
v2.1.3
- Fix for ClientMetadata dispose (too many extranneous Dispose calls)
- TestThroughput project
v2.1.2
- Client timeout now only reset upon receiving a message from a client, and no longer reset when sending a message to a client
v2.1.1
- Automatically disconnect idle clients by setting
WatsonTcpServer.IdleClientTimeoutSeconds
to a positive integer (excellent suggestion, @pha3z!)
v2.1.0
- Breaking changes
- Better documentation on StreamReceived vs MessageReceived in the XML documentation and in the README
- Modified getters and setters on StreamReceived and MessageReceived to make them mutually exclusive
- Removal of (now unnecessary) ReadDataStream parameter
- ReadStreamBufferSize is now renamed to StreamBufferSize
v2.0.8
- StartAsync() method for client and server
v2.0.x
- Changed .NET Framework minimum requirement to 4.6.1 to support use of
TcpClient.Dispose
- Better disconnect handling and support (thank you to @mikkleini)
- Async Task-based callbacks
- Configurable connect timeout in WatsonTcpClient
- Clients can now connect via SSL without a certificate
- Big thanks to @MrMikeJJ for his extensive commits and pull requests
- Bugfix for graceful disconnect through dispose (thank you @mikkleini!)
v1.3.x
- Numerous fixes to authentication using preshared keys
- Authentication callbacks in the client to handle authentication events
AuthenticationRequested
- authentication requested by the server, return the preshared key string (16 bytes)AuthenticationSucceeded
- authentication has succeeded, return trueAuthenticationFailure
- authentication has failed, return true
- Support for sending and receiving larger messages by using streams instead of byte arrays
- Refer to
TestServerStream
andTestClientStream
for a reference implementation. You must setclient.ReadDataStream = false
andserver.ReadDataStream = false
and use theStreamReceived
callback instead ofMessageReceived
v1.2.x
- Breaking changes for assigning callbacks, various server/client class variables, and starting them
- Consolidated SSL and non-SSL clients and servers into single classes for each
- Retargeted test projects to both .NET Core and .NET Framework
- Added more extensible framing support to later carry more metadata as needed
- Added authentication via pre-shared key (set Server.PresharedKey class variable, and use Client.Authenticate() method)
v1.1.x
- Re-targeted to both .NET Core 2.0 and .NET Framework 4.5.2
- Various bugfixes
v1.0.x
- Initial release
- Async support and IDisposable support
- IP filtering/permitted IP addresses support
- Improved disconnect detection
- SSL support