示例#1
0
        private void btnSair_Click(object sender, EventArgs e)
        {
            //me livro do socket do chat
            if (meuSocket != null && meuSocket.Connected)
            {
                meuSocket.Shutdown(SocketShutdown.Both);
                System.Threading.Thread.Sleep(10);
                meuSocket.Close();
                btnConectar.Enabled    = true;
                btnDesconectar.Enabled = false;
            }
            // e tambem do socket do RPC
            if (RPCchan != null)
            {
                ChannelServices.UnregisterChannel(RPCchan);
                RPCchan         = null;
                objetoRemotavel = null;
            }
            //encerra threads: however nao é o metodo correto de encerrar aplicacoes

            this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.ClientSide_FormClosing);
            this.Close();

            Environment.Exit(1);
            //nao encerra threads:
            //Application.Exit();
        }
示例#2
0
        //Assim que um socket é adicionado a lista de arrays,
        // a thread de Halndler é criada.
        //Esta thread é responsavel por aceitar as conexoes de entrada.
        /// <summary>
        /// Thread responsavel por aceitar as conexoes de entrada.
        /// </summary>
        public void listenerThread()
        {
            TcpListener tcpListener = new TcpListener(porta);

            tcpListener.Start();
            objetoRemotavel = new ObjetoRemotavel.ObjetoRemotavel();
            while (true)
            {
                Socket handlerSocket = tcpListener.AcceptSocket();
                if (handlerSocket.Connected)
                {
                    //Como tudo executado neste trecho esta em outra thread,
                    //Para modificar os componentes do Form na thread mãe
                    //Eu preciso invoca-los para nao executar uma operação ilegal.
                    if (InvokeRequired)
                    {
                        lbConexoes.Invoke((Action)(() => lbConexoes.Items.Add(handlerSocket.RemoteEndPoint.ToString() + " conectado!")));
                    }
                    lock (this)
                    {
                        nSockets.Add(handlerSocket);
                    }
                    ThreadStart thdstHandler = new
                                               ThreadStart(handlerThread);
                    Thread thdHandler = new Thread(thdstHandler);
                    thdHandler.Start();
                }
            }
        }
示例#3
0
        public void ReceberObjeto(ObjetoRemotavel.ObjetoRemotavel obj)
        {
            ChatUser user = new ChatUser();

            user.Nome = obj.Nome;
            user.MAC1 = obj.MAC;
            user.IP   = obj.IP;
            usuarios.Add(user);

            AddDGV(user);
        }
示例#4
0
        //Iniciador do RCP
        public void IniciarRCP()
        {
            // formatador customizado para o TcpChannel sink chain.
            BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();

            provider.TypeFilterLevel = TypeFilterLevel.Full;

            //Area de objeto remotavel
            objetoRemotavel = new ObjetoRemotavel.ObjetoRemotavel();
            // Usando o protocolo TCP
            IDictionary props = new Hashtable();

            props["port"] = portaRCP;
            TcpChannel channel = new TcpChannel(props, null, provider);

            //observacao, apesar de obsoleto, o metodo RegisterChannel funciona bem
            ChannelServices.RegisterChannel(channel);
            //registra o servico remotavel
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(ObjetoRemotavel.ObjetoRemotavel), RPCServerName, WellKnownObjectMode.Singleton);
            ObjetoRemotavel.Cache.Attach(this);
        }
示例#5
0
        private void btnDesconectar_Click(object sender, EventArgs e)
        {
            //me livro do socket do chat
            if (meuSocket != null && meuSocket.Connected)
            {
                meuSocket.Shutdown(SocketShutdown.Both);
                System.Threading.Thread.Sleep(10);
                meuSocket.Close();
            }
            // e tambem do socket do RPC
            if (RPCchan != null)
            {
                ChannelServices.UnregisterChannel(RPCchan);
                RPCchan         = null;
                objetoRemotavel = null;
            }

            btnConectar.Enabled    = true;
            btnDesconectar.Enabled = false;
            btnSair.Enabled        = true;
            gbChat.Enabled         = false;
            gbRPC.Enabled          = false;
        }
示例#6
0
        private void btnConectar_Click(object sender, EventArgs e)
        {
            //tem credenciais?
            if (VerificaCredenciais())
            {
                try
                {
                    //==== RPC

                    //verifico se o objeto TCP de RPC esta populado
                    if (RPCchan == null)
                    {
                        // usando o protocolo TCP
                        // neste caso ambos o servidor e cliente estao rodando na mesma maquina.
                        RPCchan = new TcpChannel();
                        //registra o canal para disponibilizar o servico.
                        ChannelServices.RegisterChannel(RPCchan);
                        // cria uma instancia do objeto remoto
                        objetoRemotavel = (ObjetoRemotavel.ObjetoRemotavel)Activator.GetObject(typeof(ObjetoRemotavel.ObjetoRemotavel),
                                                                                               "tcp://" + txtIP.Text + ":" + portaRCP.ToString() + "/" + RCPServerName);
                        //trocar o localhost pelo endereco do servidor no caso de acesso remoto
                        lblRCP.Text = "Conectado no servidor RPC em: " + txtIP.Text + ":" + portaRCP.ToString() + "/" + RCPServerName;

                        objetoRemotavel.Nome = System.Configuration.ConfigurationManager.AppSettings["NomeUser"];
                        objetoRemotavel.MAC  = System.Configuration.ConfigurationManager.AppSettings["MAC"];
                        objetoRemotavel.IP   = GetLocalIPAddress();
                        objetoRemotavel.EnviarObjeto(objetoRemotavel);
                    }

                    //==== RPC

                    // Fecha o socket se ele estiver aberto
                    if (meuSocket != null && meuSocket.Connected)
                    {
                        meuSocket.Shutdown(SocketShutdown.Both);
                        System.Threading.Thread.Sleep(10);
                        meuSocket.Close();
                    }

                    // Cria o objeto de soquete
                    meuSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    // Define o endereco de IP e porta do servidor
                    IPEndPoint epServer = new IPEndPoint(IPAddress.Parse(txtIP.Text), portaChat);

                    //conecta no servidor (metodo sem bloqueio)
                    meuSocket.Blocking = false;
                    //cria chamada de retorno asincrona
                    AsyncCallback onconnect = new AsyncCallback(OnConnect);
                    //inicia a conexao usando o ipendpoint, a chamada assincrona e o socket em si
                    meuSocket.BeginConnect(epServer, onconnect, meuSocket);
                    //notifica
                    lblStatus.Text = "Conectado no servidor Chat em: " + txtIP.Text + ":" + portaChat.ToString();

                    //mandaMsg(2, GetMacAddress(txtIP.Text));

                    gbChat.Enabled         = true;
                    gbRPC.Enabled          = true;
                    btnConectar.Enabled    = false;
                    btnDesconectar.Enabled = true;
                    btnSair.Enabled        = false;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Falha ao tentar se conecar com o servidor!");
                }
            }
            else
            {
                gbCadastro.Visible  = true;
                btnConectar.Enabled = false;
                txtMAC.Text         = NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.OperationalStatus == OperationalStatus.Up).Select(nic => nic.GetPhysicalAddress().ToString()).FirstOrDefault();
                txtNome.Focus();
            }
        }