全局套接字连接

时间:2014-05-20 14:47:02

标签: c# winforms sockets

我正在创建一个服务器 - 客户端应用程序,并且我在c#中使用Windows窗体应用程序来执行此操作。 我的问题来自客户端,我有很多表单(视图),我需要在切换视图(窗口)时保持与服务器的连接。我创建了一个类来保存全局变量,但是连接我不知道如何维护。我正在使用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();,但是当我切换视图时,我失去了连接。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

我能够做我想做的事。我创建了另一个处理连接的Static类,所有其他视图只要他们需要来自服务器的东西就会询问该类。这样我只需要有1个连接,并且我的应用程序上的所有其他视图都将数据发送到该类,然后该类直接与服务器通信。