Write a TcpClient and MulticastClient forms based of this codes:
Tcp:"{
    TopClient client;
    public Form1()
    {
        InitializeComponent();
    }
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(textBox1.Text), Convert.ToInt32(textBox2.Text));
        client = new TopClient();
        client.Connect(endPoint);
        NetworkStream netream = client.GetStream();
        byte[] barrey = Encoding.Unicode.GetBytes(textBox3.Text);
        netream.Write(barrey, 0, barrey.Length);
        client.Close();
    }
    catch (SocketException sockEx)
    {
        MessageBox.Show("Исключение сокета: " + sockEx.Message);
    }
    catch (Exception Ex)
    {
        MessageBox.Show("Исключение: " + Ex.Message);
    }
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    if (client != null)
        client.Close();
}"
Multicast:
"namespace MulticastClient
{
    public partial class Forml : Form
    {
        delegate void AppendText(string text);
        void Listner()
        {
            while (true)
            {
                Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IFEndPoint ipep = new IFEndPoint(IPAddress.Any, 8801);
                sod.Bind(ipep);
                IPAddress ip = IPAddress.Parse("224.5.5.5");
                soc.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any));
                byte[] buff = new byte[4096];
                soc.Recolve(buff);
                this.Invoke(new AppendText(AppendTextProc), Encoding.Unicode.GetString(buff));
                soc.Close();
            }
        }

        Thread listen;
        public Forml()
        {
            InitializeComponent();
            listen = new Thread(new ThreadStart(Listner));
            listen.IsBackground = true;
            listen.Start();
        }

        void AppendTextProc(string text)
        {
            dataOutput.Text = text;
        }
    }
}"
so they would work with this server:
"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics.Eventing.Reader;

namespace TCPMulticastServer
{
    class TcpMulticastServer
    {
        private const int TcpPort = 8800;
        private const int UdpPort = 8801;
        private const string MulticastIp = "224.5.5.5";
        private readonly List<TcpClient> _clients = new List<TcpClient>();
        public string clIP = null;
        public string message = null;
        public Dictionary<string, string> users = new Dictionary<string, string>();

        public void Start()
        {
            TcpListener tcpListener = new TcpListener(IPAddress.Any, TcpPort);
            tcpListener.Start();
            Console.WriteLine($"TCP сервер запущен на порте {TcpPort}");

            new Thread(() =>
            {
                while (true)
                {
                    TcpClient client = tcpListener.AcceptTcpClient();
                    lock (_clients)
                    {
                        _clients.Add(client);
                    }
                    Console.WriteLine("Клиент подключен");
                    clIP = ((IPEndPoint)client.Client.LocalEndPoint).Address.ToString();


                    new Thread(() =>
                    {
                        if (users.ContainsKey(clIP))
                        {
                            using (NetworkStream stream = client.GetStream())
                            {
                                byte[] buffer = new byte[1024];
                                int bytesRead;
                                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                                {
                                    string message = Encoding.Unicode.GetString(buffer);
                                    string username = users[clIP];
                                    string message_post = "Пользователь " + username + ": " + message;
                                    Console.WriteLine(message + " " + message_post);
                                    BroadcastMessage(message_post);
                                }
                            }
                        }
                        else
                        {

                            using (NetworkStream stream = client.GetStream())
                            {
                                Console.WriteLine("Новый клиент подключен");
                                byte[] buffer = new byte[1024];
                                int bytesRead;
                                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                                {
                                    string message = Encoding.Unicode.GetString(buffer);
                                    users.Add(clIP, message);
                                    string message_post = "Пользователь " + message + "вошел в чат";
                                    Console.WriteLine(message + " " + message_post);
                                    BroadcastMessage(message_post);
                                }
                            }
                        }
                        lock (_clients)
                        {
                            _clients.Remove(client);
                        }
                        Console.WriteLine("Клиент отключен.");

                    }).Start();
                }
            }).Start();
        }

        private void BroadcastMessage(string message_post)
        {
            UdpClient udpClient = new UdpClient();
            udpClient.JoinMulticastGroup(IPAddress.Parse(MulticastIp));

            byte[] data = Encoding.Unicode.GetBytes(message_post);
            udpClient.Send(data, data.Length, MulticastIp, UdpPort);
            udpClient.Close();

            Console.WriteLine($"Широковещательное сообщение отправлено: {message_post}");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            TcpMulticastServer server = new TcpMulticastServer();
            server.Start();

            Console.WriteLine("Нажмите Enter для завершения работы");
            Console.ReadLine();
        }
    }
}
"

when client writes first message it becomes his nickname, and he will be added to system and will be able to chat in public chat.
all messages from client will be displayed with his nickname in the front of the message.
in forms there will be a menu button that will allow client to start private chat with other user that he will pick from list. Private allows for files transfer.
both public and private chats allow usage of emojies.
there must be a menu option to export public chat whole history into html or text.
when client joins and leaves the list of clients must change accordingly.
show me all codes from all files that project has. separate tcp, multicast - clients and server into it's own separate projects that can be opened sepratly.
don't change ".csproj" file.