dotnet/WatsonTcp

WatsonTcp does not work in ExDUIR interface framework with net8.0

williamlzw opened this issue · 11 comments

The tcp client and server of WatsonTcp cannot receive messages after compiling the .net 8.0.0-preview.7.23375.6 program in visual studio 2022 V17.8.0 Preview 1.0.
dotnet-sdk-8.0.100-preview.7.23376.3-win-x64

Seems to work for me on Windows 11.

image

I'm also using 17.8 preview 1.0, and

C:\Code\Watson\WatsonTcp\src\Test.Server\bin\Debug\net8.0>dotnet --version
8.0.100-preview.7.23376.3

Can you provide sample code to reproduce? Can you test with Test.Client and Test.Server?

private static void CreateClient()
{
    client = new WatsonTcpClient("127.0.0.1", 9000);
    client.Events.ServerConnected += ServerConnected;
    client.Events.ServerDisconnected += ServerDisconnected;
    client.Events.MessageReceived += MessageReceivedClient;
    client.Callbacks.SyncRequestReceived = SyncRequestReceivedClient;
    client.Connect();
}

private static void CreateServer()
{
    server = new WatsonTcpServer("127.0.0.1", 9000);
    server.Events.ClientConnected += ClientConnected;
    server.Events.ClientDisconnected += ClientDisconnected;
    server.Events.MessageReceived += MessageReceived;
    server.Callbacks.SyncRequestReceived = SyncRequestReceived;
    server.Events.AuthenticationFailed += AuthenticationFailed;
    server.Start();
}

static void AuthenticationFailed(object sender, AuthenticationFailedEventArgs e)
{
    Console.WriteLine("AuthenticationFailed: " + e.ToString());
}

static void MessageReceivedClient(object sender, MessageReceivedEventArgs args)
{
    Console.WriteLine("Message from server: " + Encoding.UTF8.GetString(args.Data));
}

static void ServerConnected(object sender, ConnectionEventArgs args)
{
    Console.WriteLine("Server connected");
}

static void ServerDisconnected(object sender, DisconnectionEventArgs args)
{
    Console.WriteLine("Server disconnected");
}

static SyncResponse SyncRequestReceivedClient(SyncRequest req)
{
    return new SyncResponse(req, "Hello back at you!");
}

static void ClientConnected(object sender, ConnectionEventArgs args)
{
    guid = args.Client.Guid;
    Console.WriteLine("Client connected: " + args.Client.IpPort.ToString());
}

static void ClientDisconnected(object sender, DisconnectionEventArgs args)
{
    Console.WriteLine("Client disconnected: " + args.Client.IpPort.ToString() + ": " + args.Reason.ToString());
}

static void MessageReceived(object sender, MessageReceivedEventArgs args)
{
    Console.WriteLine("Message from " + args.Client.IpPort.ToString() + ": " + Encoding.UTF8.GetString(args.Data));
}

static SyncResponse SyncRequestReceived(SyncRequest req)
{
    return new SyncResponse(req, "Hello back at you!");
}

Hi @williamlzw I isolated the code down to the following, and modified it to send some messages back and forth:

using System.Text;
using System;
using WatsonTcp;

namespace Isolated
{
    internal class Program
    {
        static WatsonTcpClient _Client = null;
        static WatsonTcpServer _Server = null;
        static Guid _ClientGuid;

        static void Main(string[] args)
        {
            Console.WriteLine("Starting server...");
            CreateServer();
            Task.Delay(2000).Wait();

            Console.WriteLine("Starting client...");
            CreateClient();

            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine("Sending message from client to server (" + i + "/10)");
                _Client.Send("Message " + i);
            }

            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine("Sending message from server to client (" + i + "/10)");
                _Server.Send(_ClientGuid, "Message " + i);
            }

            Console.WriteLine("Press ENTER to exit");
            Console.ReadLine();
        }

        private static void CreateClient()
        {
            _Client = new WatsonTcpClient("127.0.0.1", 9000);
            _Client.Events.ServerConnected += ServerConnected;
            _Client.Events.ServerDisconnected += ServerDisconnected;
            _Client.Events.MessageReceived += MessageReceivedClient;
            _Client.Callbacks.SyncRequestReceived = SyncRequestReceivedClient;
            _Client.Connect();
        }

        private static void CreateServer()
        {
            _Server = new WatsonTcpServer("127.0.0.1", 9000);
            _Server.Events.ClientConnected += ClientConnected;
            _Server.Events.ClientDisconnected += ClientDisconnected;
            _Server.Events.MessageReceived += MessageReceived;
            _Server.Callbacks.SyncRequestReceived = SyncRequestReceived;
            _Server.Events.AuthenticationFailed += AuthenticationFailed;
            _Server.Start();
        }

        static void AuthenticationFailed(object sender, AuthenticationFailedEventArgs e)
        {
            Console.WriteLine("AuthenticationFailed: " + e.ToString());
        }

        static void MessageReceivedClient(object sender, MessageReceivedEventArgs args)
        {
            Console.WriteLine("Message from server: " + Encoding.UTF8.GetString(args.Data));
        }

        static void ServerConnected(object sender, ConnectionEventArgs args)
        {
            Console.WriteLine("Server connected");
        }

        static void ServerDisconnected(object sender, DisconnectionEventArgs args)
        {
            Console.WriteLine("Server disconnected");
        }

        static SyncResponse SyncRequestReceivedClient(SyncRequest req)
        {
            return new SyncResponse(req, "Hello back at you!");
        }

        static void ClientConnected(object sender, ConnectionEventArgs args)
        {
            _ClientGuid = args.Client.Guid;
            Console.WriteLine("Client connected: " + args.Client.IpPort.ToString());
        }

        static void ClientDisconnected(object sender, DisconnectionEventArgs args)
        {
            Console.WriteLine("Client disconnected: " + args.Client.IpPort.ToString() + ": " + args.Reason.ToString());
        }

        static void MessageReceived(object sender, MessageReceivedEventArgs args)
        {
            Console.WriteLine("Message from " + args.Client.IpPort.ToString() + ": " + Encoding.UTF8.GetString(args.Data));
        }

        static SyncResponse SyncRequestReceived(SyncRequest req)
        {
            return new SyncResponse(req, "Hello back at you!");
        }
    }
}

And it worked for me:

C:\Users\joelc\Downloads\TestWatsonTcp\Isolated\bin\Debug\net8.0>isolated
Starting server...
Starting client...
Server connected
Sending message from client to server (1/10)
Client connected: 127.0.0.1:61378
Sending message from client to server (2/10)
Sending message from client to server (3/10)
Sending message from client to server (4/10)
Sending message from client to server (5/10)
Sending message from client to server (6/10)
Sending message from client to server (7/10)
Sending message from client to server (8/10)
Sending message from client to server (9/10)
Sending message from client to server (10/10)
Sending message from server to client (1/10)
Sending message from server to client (2/10)
Sending message from server to client (3/10)
Sending message from server to client (4/10)
Sending message from server to client (5/10)
Sending message from server to client (6/10)
Sending message from server to client (7/10)
Sending message from server to client (8/10)
Sending message from server to client (9/10)
Sending message from server to client (10/10)
Press ENTER to exit
Message from server: Message 1
Message from 127.0.0.1:61378: Message 1
Message from server: Message 2
Message from server: Message 3
Message from server: Message 4
Message from server: Message 5
Message from server: Message 6
Message from server: Message 7
Message from server: Message 8
Message from 127.0.0.1:61378: Message 2
Message from server: Message 9
Message from server: Message 10
Message from 127.0.0.1:61378: Message 3
Message from 127.0.0.1:61378: Message 4
Message from 127.0.0.1:61378: Message 5
Message from 127.0.0.1:61378: Message 6
Message from 127.0.0.1:61378: Message 7
Message from 127.0.0.1:61378: Message 8
Message from 127.0.0.1:61378: Message 9
Message from 127.0.0.1:61378: Message 10

Here's the .csproj file:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="WatsonTcp" Version="5.1.6" />
  </ItemGroup>

</Project>

The pure console can run, but the message sent by the client cannot be received by using my interface framework. But client messages can be received in net7.

You can change the solution code I posted to the .net7 framework. Messages can be received.

I'm not sure why it's not working via your interface framework. I've never used it and don't have expertise with it.

I downloaded the source code of WatsonTcp, compiled the class library with .net8.0, and resumed normal use in my interface framework.

The problem is that the package on nuget is only compiled by net7.0, and there will be problems running on net8.0, which may be related to the message loop or multi-threading of the window.

Ah, got it. Thank you @williamlzw. As soon as net8.0 is released I'll be sure to update and re-target to include it.

On another note, do you have documentation in English for your framework? I'd love to learn more.

Cheers, Joel