Как я могу создать клиентское приложение с сервера?
Здравствуйте, у меня есть 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
Не то чтобы невозможно, но довольно сложно. Вам понадобится слушатель (он же серверный процесс) на клиенте.