Member 13866431 Ответов: 1

Как я могу создать клиентское приложение с сервера?


Здравствуйте, у меня есть TCP-клиент / серверное решение.

Теперь мои клиенты успешно подключаются к моему серверу, но хотели бы "сгенерировать" клиент с сервера и передать ему некоторые "параметры"(переменные).

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

Если у вас есть какие-либо сомнения по поводу этой просьбы, пожалуйста, запишите ее, и я постараюсь быть как можно более ясным.

Спасибо.

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

Я искал в интернете возможное решение, но, к сожалению, не нашел ничего, что могло бы помочь.

Во всяком случае это мое приложение формы сервера:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Server
{
    public partial class Form1 : Form
    {

        private static Socket serverSocket;
        private static List<Socket> clientSocket = new List<Socket>();

        private const int buff_size = 2000000;
        private static byte[] buff = new byte[buff_size];

        bool button_set_port_clicked;

        //VALUES TO PASS TO THE CLIENT (GENERATED ON THE FORM APPLICATION WITH 3 TEXTBOX)

        private static String FtpAddress = "";
        private static String FtpUser = "";
        private static String FtpPass = "";

        //-----------------------------------


        private void SetupServer(int port)
        {

            if (button_set_port_clicked)
            {
                label5.Text = textPort.Text;
            }

            if(textFtpAdd.Text == "..." || textFtpUser.Text == "..." || textFtpPass.Text == "...")
            {

                MessageBox.Show("FTP Configuration Incomplete!");
                Environment.Exit(1);

            }

            label1.Text = "Starting server on port " + port;

            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
            serverSocket.Listen(5);
            serverSocket.BeginAccept(AcceptCallBack, null);

            label1.Text = "Server running on port " + port;
        }

        private void AcceptCallBack(IAsyncResult AR)
        {
            Socket socket;

            try
            {
                socket = serverSocket.EndAccept(AR);
            }
            catch (ObjectDisposedException)
            {
                return;
            }

            clientSocket.Add(socket);

            socket.BeginReceive(buff, 0, buff_size, SocketFlags.None, ReceiveCallBack, socket);

            serverSocket.BeginAccept(AcceptCallBack, null);

        }

        private void ReceiveCallBack(IAsyncResult AR)
        {
            Socket current = (Socket)AR.AsyncState;

            int received;

            try
            {
                received = current.EndReceive(AR);
            }
            catch (SocketException)
            {
                Console.WriteLine("Client disconnesso!");
                current.Close();

                clientSocket.Remove(current);
                return;
            }

            byte[] recbuf = new byte[received];
            Array.Copy(buff, recbuf, received);

            String text = Encoding.ASCII.GetString(recbuf);

            current.BeginReceive(buff, 0, buff_size, SocketFlags.None, ReceiveCallBack, current);

        }

        /*

        private void CloseAllSockets()
        {
            foreach (Socket socket in clientSocket)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }

            serverSocket.Close();
        }

        private void ListClients()
        {
            int i = 0;

            foreach (Socket socket in clientSocket)
            {
                Console.WriteLine("Server " + i + "\n");
                i = i + 1;
            }
        }

        */

        private void LocalIP()
        {
            var host = Dns.GetHostEntry(Dns.GetHostName());

            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    String IP = ip.ToString();
                    textLocal.Text = IP;
                }
            }

        }


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LocalIP();

            textLocal.ReadOnly = true;
            textDNS.ReadOnly = true;
            textPort.ReadOnly = true;
            textCheckPort.ReadOnly = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int port = 4444;

            if (button_set_port_clicked)
            {
                String _port = textPort.Text;

                Int32.TryParse(_port, out port);

                SetupServer(port);
            }

            SetupServer(port); 
        }

        private void radioLocal_CheckedChanged(object sender, EventArgs e)
        {
            textPort.ReadOnly = false;

            textDNS.ReadOnly = true;
            textDNS.Text = "DNS Address";

            textLocal.ReadOnly = true;
        }

        private void radioDNS_CheckedChanged(object sender, EventArgs e)
        {
            textDNS.ReadOnly = false;
            textDNS.Text = "";

            textPort.ReadOnly = false;
            textPort.Text = "4444";

            textLocal.ReadOnly = true;
           
        }

        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void button_check_port_Click(object sender, EventArgs e)
        {

        }

        private void button_set_port_Click(object sender, EventArgs e)
        {
            button_set_port_clicked = true; //PORTA SETTATA

            label5.Text = textPort.Text;
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
        }
    }
}

Richard MacCutchan

Вам просто нужно, чтобы сервер отправил параметры в ответ на первое сообщение от клиента. Чтобы сделать это правильно, клиент должен отправить на сервер специальное сообщение, которое затем ответит соответствующими данными.

Member 13866431

Это способ, но не в моем случае. Я должен извиниться, потому что я не указал, что на сервере вы можете установить свой DNS-сервер, поэтому я должен отправить клиенту новый возможный адрес перед подключением (конечно).

Richard MacCutchan

Удачи тебе с этим.

Member 13866431

Это другой способ сказать, что это невозможно?

Richard MacCutchan

Не то чтобы невозможно, но довольно сложно. Вам понадобится слушатель (он же серверный процесс) на клиенте.

1 Ответов

Рейтинг:
0

Gerry Schmitz

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

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


Member 13866431

Ладно, я признаю, что это кажется трудным...

Но что вы имеете в виду под "удаленной машиной"? Я хочу породить клиента на той же машине сервера, надеюсь, это понятно.

Gerry Schmitz

Ваше случайное использование слова "сервер" заставляет меня думать, что это должен быть "удаленный" сервер.

Код, который вы опубликовали, "выглядит" так, как будто он уже работает с "локальными клиентами и сервером"; то есть он уже "делает" то, что вы бы "хотели", чтобы он делал ... (?!)

Member 13866431

Мой клиент успешно подключается к серверу, но дело не в этом.

Я хочу сгенерировать клиент с помощью кнопки на сервере.

Сервер-это приложение формы, когда я могу установить параметры клиента.

Когда я нажимаю кнопку, он должен спросить меня имя и где сохранить его на моей локальной машине (где у меня также есть сервер), и он должен передать некоторые параметры, установленные на сервере.

Gerry Schmitz

Теперь я понимаю ... все противоположно тому, что вы говорите...

Или какая-нибудь история наоборот.

(Для чего же тогда нужен "button1_click"?)

Member 13866431

Я попытался объяснить это как можно лучше, но я не англичанин, и C # для меня совершенно новый. Извини, если я не смог тебя понять.

В любом случае...

Button1_click предназначен для запуска сервера.

Он вызывает SetupServer()

Gerry Schmitz

Правильно... который затем через сервер "обратных вызовов" добавляет клиентов.

С твоим английским все в порядке, просто игра ума.

Member 13866431

Моей целью было не запутать тебя, ха-ха-ха.

Однако теперь, когда вы поняли (надеюсь, что так) Можно ли делать то, что я хочу?