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(); }
//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(); } } }
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); }
//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); }
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; }
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(); } }