jedimaster100 Ответов: 1

Консольное приложение для C# WPF


Всем привет. Я хотел бы узнать, не могли бы вы мне помочь со следующим.
Мне нужно преобразовать проект, который находится на GibHub, а именно: [^]

Мне нужно иметь возможность получить доступ и/или переопределить методы, которые находятся в классе.
Например, для
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using NetCoreServer;

namespace TcpChatServer
{
    class ChatSession : TcpSession
    {
        public ChatSession(TcpServer server) : base(server) {}

        protected override void OnConnected()
        {
            Console.WriteLine($"Chat TCP session with Id {Id} connected!");

            // Send invite message
            string message = "Hello from TCP chat! Please send a message or '!' to disconnect the client!";
            SendAsync(message);
        }

        protected override void OnDisconnected()
        {
            Console.WriteLine($"Chat TCP session with Id {Id} disconnected!");
        }

        protected override void OnReceived(byte[] buffer, long offset, long size)
        {
            string message = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
            Console.WriteLine("Incoming: " + message);

            // Multicast message to all connected sessions
            Server.Multicast(message);

            // If the buffer starts with '!' the disconnect the current session
            if (message == "!")
                Disconnect();
        }

        protected override void OnError(SocketError error)
        {
            Console.WriteLine($"Chat TCP session caught an error with code {error}");
        }
    }

    class ChatServer : TcpServer
    {
        public ChatServer(IPAddress address, int port) : base(address, port) {}

        protected override TcpSession CreateSession() { return new ChatSession(this); }

        protected override void OnError(SocketError error)
        {
            Console.WriteLine($"Chat TCP server caught an error with code {error}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // TCP server port
            int port = 1111;
            if (args.Length > 0)
                port = int.Parse(args[0]);

            Console.WriteLine($"TCP server port: {port}");

            Console.WriteLine();

            // Create a new TCP chat server
            var server = new ChatServer(IPAddress.Any, port);

            // Start the server
            Console.Write("Server starting...");
            server.Start();
            Console.WriteLine("Done!");

            Console.WriteLine("Press Enter to stop the server or '!' to restart the server...");

            // Perform text input
            for (;;)
            {
                string line = Console.ReadLine();
                if (string.IsNullOrEmpty(line))
                    break;

                // Restart the server
                if (line == "!")
                {
                    Console.Write("Server restarting...");
                    server.Restart();
                    Console.WriteLine("Done!");
                    continue;
                }

                // Multicast admin message to all sessions
                line = "(admin) " + line;
                server.Multicast(line);
            }

            // Stop the server
            Console.Write("Server stopping...");
            server.Stop();
            Console.WriteLine("Done!");
        }
    }
}


Что я уже пробовал:

Во - первых, мне не понадобятся консольные выходы. Я уже переместил приведенный выше код в отдельный класс. Теперь я хочу использовать метод OnError из своего кода.

Как я могу это сделать?

1 Ответов

Рейтинг:
6

OriginalGriff

Это не так просто: код, который вы нашли, основан на консоли, а не на графическом интерфейсе, и эти две среды совершенно разные.
Там, где консоль "отвечает" и получает нужные данные от пользователя, когда он этого хочет, графическое приложение этого не делает - оно реагирует на пользовательский ввод и обрабатывает его на основе этого.
Таким образом, изменение консольного приложения, которое находится в цикле вызова ReadLine в приложение на основе графического интерфейса, не является тривиальным делом - все приложение должно быть "переделано", чтобы соответствовать парадигме графического интерфейса.

Это немного похоже на то, как взять хоккейную команду и ожидать, что они выиграют футбольные матчи, потому что "есть две команды, играющие, и у них обоих есть цели".

Что вам нужно сделать, так это, вероятно, использовать поток графического интерфейса и по крайней мере один фоновый рабочий поток для обработки коммуникаций - смоделированных (но не идентичных ни в коей мере) функциональности существующего кода, а не пытаться слепо конвертировать код из одной парадигмы в другую. Но это переписывание, а не преобразование.