Я создаю приложение Server-Client, и для этого я использую приложения для форм Windows в С#. Моя проблема возникает у клиента, у меня много форм (Views), и мне нужно поддерживать соединение с сервером при переключении просмотров (окон). Я создал класс для хранения глобальных переменных, но соединение я понятия не имею, как поддерживать. Я использую TCP-сокеты, я вывешу свой класс globalVariables
:
static class GlobalVariables
{
public static Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static IPEndPoint newPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000);
public static int msgRec = 0;
public static String msgConverted ="";
public static byte[] data = new byte[1024];
public static void receiveMsgFromServer()
{
msgRec = client.Receive(data); //metodo que retorna o numero de bytes da mensagem (recebe o array de bytes)
msgConverted = Encoding.ASCII.GetString(data, 0, msgRec); //metodo que converte os bytes em string
Microsoft.VisualBasic.Interaction.MsgBox(msgConverted);
}
public static void connect()
{
client.Connect(newPoint);
}
}
}
class MultiThreadedTcpServer
{
static void Main(string[] args)
{
//Servidor TCP
Socket newSocket = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//server
IPEndPoint newPoint = new IPEndPoint(IPAddress.Any, 6000); //ponto de acesso no port 6000 para todos os endereços de IP da maquina
newSocket.Bind(newPoint);//associar o ponto de acesso ao socket
newSocket.Listen(10);
Console.WriteLine("Waiting...");
//Cliente - definir o comportamente para com o cliente
Socket client;
sharedData counter = new sharedData(); // este objecto é passado por referencia para as outras classes logo estes olham todos para o mesmo
while (true)
{
client = newSocket.Accept(); // socket usado para comunicar com o cliente (NAO É O CLIENTE !!!!!!)
IPEndPoint remoteEndPoint = (IPEndPoint)client.RemoteEndPoint; // informacao sobre o ponto de acesso do cliente
Console.WriteLine(remoteEndPoint +" " + "Connected"); // escreve esta linha na consola do programa para o admin saber que houve uma conexao
//criar uma thread para cada novo cliente passando-lhe a respectiva ligacao remota
ClientHandler clientHandler = new ClientHandler(client, remoteEndPoint, counter); //nos parametros passamos o socket do client e o endpoint do cliente
counter.clientes.Add(client);
Thread t = new Thread (new ThreadStart(clientHandler.clientProc));
t.Start();
}
}
}
Извините за португальские комментарии. Цель состоит в том, чтобы многие клиенты подключались к одному серверу (вот почему у меня есть потоки), все работает нормально. Теперь моя проблема в том, что я загружаю GlobalVariables.Connect();
когда я запускаю свое клиентское приложение, но когда я переключаю представления, я теряю соединения. Какие-нибудь советы?
Я смог сделать то, что хотел. Я создал еще один класс Static, который обрабатывает соединение, и все остальные представления просто спрашивают этот класс, когда им нужно что-то с сервера. Таким образом, мне нужно иметь только 1 соединение, а все остальные представления в моем приложении отправляют данные этому классу, а затем этот класс напрямую связывается с сервером.