Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIP – UNIVERSIDADE PAULISTA Curso de Ciência da Computação ATIVIDADES PRÁTICAS SUPERVISONADAS – APS DESENVOLVIMENTO DE FERRAMENTA PARA COMUNICAÇÃO EM REDE Gabriel Merlin RA: C628FF8 Gustavo Santos de Oliveira RA: C42AAB2 UNIP – UNIVERSIDADE PAULISTA Curso de Ciência da Computação ATIVIDADES PRÁTICAS SUPERVISONADAS – APS DESENVOLVIMENTO DE FERRAMENTA PARA COMUNICAÇÃO EM REDE Atividades Práticas Supervisionadas do 5º Semestre do Curso de Ciência da Computação da Universidade Paulista – UNIP SUMÁRIO 1. INTRODUÇÃO .......................................................................................... 7 2. OBJETIVO ................................................................................................ 8 3. FUNDAMENTOS DA COMUNICAÇÃO DE DADOS EM REDE ................... 9 3.1 Redes de computadores/Protocolos e serviços de rede ......................... 9 3.2 Funções dos Protocolos........................................................ 10 3.3 Hierarquia ............................................................................ 10 3.4 Serviços de Rede ................................................................. 12 3.5 Classificação de serviços ...................................................... 13 4. DESENVOLVIMENTO ............................................................................. 15 4.1 Servidor ............................................................................... ..............15 4.2 Cliente ................................................................................. ..............17 5. PROJETO (ESTRUTURA) DO PROGRAMA ............................................ 19 6. CÓDIGO FONTE ..................................................................................... 22 6.1 Cliente ................................................................................. ..............22 6.2 Servidor ............................................................................... ..............39 7. REFERÊNCIAS BIBLIOGRÁFICAS............................................................51 7 1. INTRODUÇÃO Nos dia de hoje precisamos de facilidade na comunicação entre diversos usuários através de dispositivos conectados em uma rede. Para essa comunicação utilizamos o protocolo TCP/IP, que é o principal protocolo de envio e recebimento de dados. O TCP/IP também é conhecido como um conjunto de protocolos. Seu nome é a junção de dois protocolos responsáveis por comunicações entre computadores, o TCP (Transfer Control Protocol) e o IP (Internet Protocol). A pilha de protocolos TCP/IP consiste em diversos protocolos como: HTTP, SMTP, FTP, SNMP, TCP, UDP, ARP, IP, ICMP E IGMP. Com o intuito de facilitar a comunicação entre os usuários de uma empresa, o grupo desenvolveu um aplicativo de troca de mensagens que utiliza o protocolo TCP/IP para a comunicação. 8 2. OBJETIVO Dada a amplitude no campo de estudo referente a Redes de Computadores e dada a possibilidade de estudo do conceito de comunicação, pôde ser estudado, dentro de um contexto especifico, o desenvolvimento de um aplicativo que fizesse a comunicação entre dois ou mais computadores. A estrutura do aplicativo será feita na linguagem Java, que trará o projeto (estrutura) do programa e todas as linhas de código explicando detalhadamente como foi feito o aplicativo de comunicação em rede. O objetivo desta aplicação é enviar e receber mensagens através de sockets usando o transporte do tipo TCP. 9 3. FUNDAMENTOS DA COMUNICAÇÃO DE DADOS EM REDE 3.1 Redes de computadores/Protocolos e serviços de rede Podemos pensar em rede de computadores como diversas máquinas interligadas fisicamente entre si onde os seus utilizadores promovem a troca de informação de seu interesse. Entretanto, uma rede não pode ser bem estabelecida considerando apenas o hardware como preocupação principal como nas primeiras redes, atualmente o software é considerado uma das partes mais importantes na concepção de novas tecnologias de redes de computadores. Protocolo é o conjunto de regras sobre o modo como se dará a comunicação entre as partes envolvidas. Protocolo é a "língua" dos computadores, ou seja, uma espécie de idioma que segue normas e padrões determinados. É através dos protocolos que é possível a comunicação entre um ou mais computadores. Os protocolos de rede nasceram da necessidade de conectar equipamentos de fornecedores distintos, executando sistemas distintos, sem ter que escrever a cada caso programas específicos. Ambos os computadores devem estar configurados com os mesmos parâmetros e obedecer aos mesmos padrões para que a comunicação possa ser realizada sem erros. Existem diversos tipos de protocolos de rede, variando de acordo com o serviço a ser utilizado. De maneira geral há dois tipos de protocolos: Abertos e Proprietários ou Específicos. Os protocolos Abertos são os protocolos padrões da internet. Este pode comunicar com outros protocolos que utilizam o mesmo padrão de protocolo. Um exemplo seria o TCP/IP, pois ele pode comunicar com várias plataformas como Windows, Linux, Mac e outros. Já os protocolos Proprietários são feitos para ambiente específicos (daí o seu nome), pois ele apenas pode comunicar com uma plataforma padrão. Exemplos desse tipo de protocolo: IPX/SPX, NETBIOS e outros. São exemplos de protocolos de rede: IP (Internet Protocol), DHCP (Dynamic Host Configuration Protocol), TCP (Transmission Control Protocol), HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol), Telnet (Telnet Remote 10 Protocol), SSH (SSH Remote Protocol), POP3 (Post Office Protocol 3), SMTP (Simple Mail Transfer Protocol), IMAP (Internet Message Access Protocol). 3.2 Funções dos Protocolos Uma das funções dos protocolos é pegar os dados que serão transmitidos pela rede, dividir em pequenos pedaços chamados pacotes, na qual dentro de cada pacote há informações de endereçamento que informam a origem e o destino do pacote. É através do protocolo que as fases de estabelecimento, controle, tráfego e encerramento, componentes da troca de informações são sistematizadas. O protocolo desempenha as seguintes funções: • Endereçamento: especificação clara do ponto de destino da mensagem; • Numeração e sequencia: individualização de cada mensagem, através de número sequencial; • Estabelecimento da conexão: estabelecimento de um canal lógico fechado entre fonte e destino; • Confirmação de recepção: confirmação do destinatário, com ou sem erro, após cada segmento de mensagem; • Controle de erro: detecção e correção de erros; • Retransmissão: repetição da mensagem a cada recepção de mensagem; • Conversão de código: adequação do código às características do destinatário; • Controle de fluxo: manutenção de fluxos compatíveis com os recursos disponíveis. 3.3 Hierarquia Como já foi visto um protocolo é um conjunto de regras sobre o modo como se dará a comunicação entre as partes envolvidas. 11 Com o intuito de reduzir a complexidade do projeto, a maioria das redes foi organizada como uma série de níveis ou camadas, que são colocadas uma sobre a outra. O número, o nome, o conteúdo e a função de cada camada diferem de uma rede para outra. Em todas as redes, no entanto, o objetivo de cada camada é oferecer determinados serviços para as camadas superiores. A camada n de uma máquina comunica-se com a camada n de outra máquina. Para isso acontecer, ela baseia-se num conjunto de convenções e regras que vão permitir gerenciar esta comunicação na qual foi nomeada de protocolo da camada n, ou, simplesmente, protocolo n. Figura 1: Hierarquia das camadas As entidades que ocupam as mesmas camadas em diferentes máquinas são chamadas de PARES. São os pares que se comunicamutilizando o protocolo. Os dados não são transferidos diretamente entre os pares, pois não existe meio físico entre eles. Então cada camada transfere os dados para a camada inferior a ela, até alcançar a última camada. Após a última camada está o meio físico (meio de transmissão) através do qual se dá a comunicação. Em cada par de camadas adjacentes, há uma INTERFACE (Define as operações e serviços que a camada inferior tem a oferecer para a camada 12 superior a ela). Ao conjunto das camadas compondo uma rede dá-se o nome de arquitetura da rede. As especificações da arquitetura devem conter informações suficientes para permitir o correto desenvolvimento da rede, tanto do ponto de vista do software quanto do hardware. Por outro lado, os detalhes de implementação dos mecanismos em cada camada, assim como as especificações detalhadas das interfaces não fazem parte da definição da arquitetura da rede. Resumindo, o protocolo é um conjunto de regras que controlam o formato e o significado das informações trocadas pelas entidades pares contidas numa camada, sendo que as entidades utilizam protocolos com a finalidade de implementar as suas definições de serviços e as entidades têm a liberdade de trocarem os seus protocolos, desde que não alterem o serviço visível para os seus utilizadores. Figura 2: Serviços 3.4 Serviços de Rede Um serviço de rede é um conjunto de operações implementado por um protocolo através de uma interface, e é oferecido à camada imediatamente superior. Ele define o que uma camada é capaz de executar sem se preocupar com a maneira pela qual as operações serão executadas. 13 Cada serviço é utilizado por aplicações diferentes, podendo uma aplicação utilizar vários serviços, como, por exemplo, um browser como o Mozilla Firefox. Este utiliza, por exemplo, HTTP, SHTTP, DNS. Os serviços podem ser orientados a conexão ou não. Serviços relacionados à família TCP são orientados a conexão, enquanto serviços relacionados ao protocolo UDP são sem conexão. 3.5 Classificação de serviços • Serviços orientados a conexão: é o serviço TCP. Antes do envio de dados, um processo conhecido como handshaking cria uma conexão fraca entre os hosts. Basicamente, esse processo prepara o receptor para a recepção de pacotes. Esta conexão prévia possibilita verificar se todos os pacotes irão chegar corretamente ao destino, e em caso negativo, solicitar o reenvio dos mesmos (quando o receptor recebe um pacote, ele envia uma mensagem de confirmação ao transmissor. Se a confirmação não chegar, o pacote é reenviado), gerando uma transferência de dados confiável. Também pode fazer-se um controlo de fluxo e congestionamento, para casos em que o receptor não suporta a velocidade de envio dos pacotes, ou quando algum roteador na rede está congestionado (é enviada uma mensagem ao transmissor, reduzindo ou interrompendo a velocidade de envio de pacotes). Como exemplo de serviços orientados a conexão, TCP, temos: HTTP, FTP, Telnet. • Serviços sem conexão: é o serviço UDP (Protocolo de Datagrama de Usuário). Não há o processo de handshaking. Assim, uma aplicação apenas envia dados para um host, e com isso não há como saber se todos os pacotes chegaram. É mais rápido, mesmo por não haver a etapa da handshaking, mas é menos confiável, além de não possuir a possibilidade de controle de fluxo e congestionamento presentes no TCP. Algumas aplicações que usam o UDP: conferência de vídeo e telefone por internet. Existem outros tipos de serviços, como o DHCP, que automaticamente determina um endereço IP válido a cada host conectado à Internet e o DNS, que possibilita que o utilizador use strings, ao invés de endereços IP para se 14 conectar a outros servidores. O DNS mantém um banco de dados que relaciona cada string a um endereço IP. 15 4. DESENVOLVIMENTO Há dois tipos de Aplicação: cliente e Servidor. 4.1 Servidor O Aplicativo Chat_ServidorAPS é responsável por criar um servidor do tipo serversocket que fica aguardando conexões com a mesma porta, quando essa conexão é estabelecida uma Thread é iniciada . O Thread é responsável por abrir varias linhas de execução paralelas, ou seja, executar várias tarefas ao mesmo tempo. Após iniciar a thread, um método run é instanciado, tal método será responsável por “escutar” tudo que o socket enviar para o servidor, através deste método podemos receber e enviar tal dado recebido pelo socket. public void run() { String message, connect = "Conectado", disconnect = "Desconectado", chat = "Conversa" ; String[] data; try { while ((message = reader.readLine()) != null) { txtArea.append("Recebido: " + message + "\n"); data = message.split(":"); for (String token:data) { txtArea.append(token + "\n"); } 16 if (data[2].equals(connect)) { Transmissao((data[0] + ":" + data[1] + ":" + chat)); AdicionaUsuario(data[0]); } else if (data[2].equals(disconnect)) { Transmissao((data[0] + ":desconectou." + ":" + chat)); RemoverUsuario(data[0]); } else if (data[2].equals(chat)) { Transmissao(message); } else { txtArea.append("As Condicoes Nao Foram Satisfeitas. \n"); } } } catch (Exception ex) { txtArea.append("Conexao Perdida. \n"); clientOutputStreams.remove(cliente); 17 } } } Quando o Socket manda uma mensagem ao Servidor, o servidor através do thread, fica aguardando duas strings, uma contendo o texto enviado propriamente dito, e outra dizendo qual ação tomar sobre este texto respectivamente. Dentro do Método Run foi instanciado um vetor de String “data” que é usado para dividir em dois strings, o conteúdo recebido pelo socket, utilizando este comando: “data = message. Split(":"); “Com este comando estamos dizendo ao Servidor que caso haja “:” na mensagem significa que a mais de um texto, explicando as duas String dita anteriormente. Ainda no método run e usando a String data ,podemos identificar e direcionar as ações que o socket quer que o servidor execute, chamando métodos para executar tal ação. O método Transmissão é responsável por receber esta mensagem enviada pelo socket, Usando o comando PrintWriter podemos ler o conteúdo desta mensagem, exibir na área de texto do servidor e enviar para os demais sockets inclusive o socket que a enviou. No botão Usuários Online foi utilizado uma String ArrayList que através do comando “usuarios.stream().map((current_user)” enxergamos a quantidade de sockets conectados nesta mesma porta e exibimos na área de texto abaixo de tal botão ,os sockets conectados. 4.2 Cliente O Aplicativo Chat_ClienteAPS é responsável por iniciar um novo cliente do tipo socket que manda uma solicitação de conexão para o Servidor através do comando InputStreamReader, usando um endereço de ip e indicando a porta (Mesma do Servidor) em que deseja se conectar. Também como o 18 servidor, a cliente inicia uma thread para executar varias linhas simultaneamente. Depois de realizado a conexão com o servidor, os botões e os textFields ficam habilitados para enviar mensagens aos outros sockets conectados ao servidor. Quando a mensagem for escrita e o botão enviar for acionado, a mensagem será enviada para o servidor através dos comandos herdados pela variável do tipo PrintWriter. O comando mostrado a seguir referencia que ao enviar a mensagem ao servidor, é enviado também o nome do socket, o texto e a ação que será realizada pelo servidor, note que para separar estas strings usamos o “:” que será utilizado como modo de identificação e separação destas strings. writer.println (nome + ":" + txfMensagem.getText() + ":" + "Conversa"); Com o uso da thread(IncomingReader) dito anteriormente, podemos “escutar” o servidor e usando um vetor de string “data”,podemosidentificar e separar as strings recebidas pelo servidor através do método run.Este método run contem esta variável “data” e também outra variável do tipo string ”Stream” para identificarmos qual ação que o servidor quer que tomamos para a execução de determinada mensagem recebida. O botão Login Anônimo nos permite ocultar o nome do socket,geramos números aleatórios através do método Random e convertemos estes números em string, após isso, concatenamos estas strings e atribuímos à variável nome. Após todo este procedimento conectamos com o servidor utilizando os mesmos comandos de conexão executados anteriormente. 19 5. PROJETO (ESTRUTURA) DOPROGRAMA. Figura 3: Janela do Cliente 20 Figura 5: Janela Servidor 21 Figura 7: Tela Servidor com clientes logados e enviando mensagem 22 6. CÓDIGO FONTE 6.1 Cliente public class Cliente extends javax.swing.JFrame { String nome, ip = "localhost"; ArrayList<String> usuarios = new ArrayList(); int porta = 2222; Boolean Conexao = false; String nomeArq; Socket sock; BufferedReader reader; PrintWriter writer; File file=null; String ArqBase64=""; Cliente cliente; private String Caminho; private String NomeArquivo; public void ListaThread() { Thread IncomingReader = new Thread(new IncomingReader()); IncomingReader.start(); } public void AddUsuario(String data) { usuarios.add(data); } 23 public void RemoverUsuario(String data) { txtMensagens.append(data + " Voce esta Offline!.\n"); } public void LimparUsuarios() { String[] tempList = new String[(usuarios.size())]; usuarios.toArray(tempList); for (String token:tempList) { } } public void DesconectarUsuario() { String bye = (nome + ": :Desconectado"); try { writer.println(bye); writer.flush(); } catch (Exception e) { txtMensagens.append("Nao foi possivel Enviar a mensagem.\n"); } } public void Desconectar() { try { txtMensagens.append("Desconectado.\n"); sock.close(); } catch(Exception ex) 24 { txtMensagens.append("Erro para Desconectar. \n"); } Conexao = false; txfNome.setEditable(true); } public Cliente() { initComponents(); } public class IncomingReader implements Runnable { @Override public void run() { String[] data; String stream, done = "Done", connect = "Conectado", disconnect = "Desconectado", chat = "Conversa" ; try { while ((stream = reader.readLine()) != null) { data = stream.split(":"); if (data[2].equals(chat)) { txtMensagens.append(data[0] + ": " + data[1] + "\n"); txtMensagens.setCaretPosition(txtMensagens.getDocument().getLength()); 25 } else if (data[2].equals(connect)) { txtMensagens.removeAll(); AddUsuario(data[0]); } else if (data[2].equals(disconnect)) { RemoverUsuario(data[0]); } else if (data[2].equals(done)) { LimparUsuarios(); usuarios.clear(); } } }catch(Exception ex) { } } } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { fcSalvarArquivo = new javax.swing.JFileChooser(); fcArquivo = new javax.swing.JFileChooser(); jPanel1 = new javax.swing.JPanel(); lblIp = new javax.swing.JLabel(); 26 txfIp = new javax.swing.JTextField(); lblPorta = new javax.swing.JLabel(); txfPorta = new javax.swing.JTextField(); lblNome = new javax.swing.JLabel(); txfNome = new javax.swing.JTextField(); btnConectar = new javax.swing.JButton(); btnDesconectar = new javax.swing.JButton(); btnLoginAnonimo = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); txtMensagens = new javax.swing.JTextArea(); txfMensagem = new javax.swing.JTextField(); btnEnviar = new javax.swing.JButton(); jSeparator1 = new javax.swing.JSeparator(); jLabel1 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Chat - Client's frame"); setName("client"); // NOI18N setResizable(false); jPanel1.setBackground(new java.awt.Color(204, 255, 204)); jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); lblIp.setText("Ip:"); txfIp.setText("localhost"); txfIp.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); txfIp.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txfIpActionPerformed(evt); } 27 }); lblPorta.setText("Porta:"); txfPorta.setText("2222"); txfPorta.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); txfPorta.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txfPortaActionPerformed(evt); } }); lblNome.setText("Nome:"); txfNome.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); txfNome.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txfNomeActionPerformed(evt); } }); btnConectar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/conectar.png"))); // NOI18N btnConectar.setText("Conectar"); btnConectar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnConectarActionPerformed(evt); } }); 28 btnDesconectar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/sair.png"))); // NOI18N btnDesconectar.setText("Desconectar"); btnDesconectar.setEnabled(false); btnDesconectar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnDesconectarActionPerformed(evt); } }); btnLoginAnonimo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/Useranonimo.png"))); // NOI18N btnLoginAnonimo.setText("LoginAnonimo"); btnLoginAnonimo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnLoginAnonimoActionPerformed(evt); } }); txtMensagens.setEditable(false); txtMensagens.setColumns(20); txtMensagens.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N txtMensagens.setRows(5); txtMensagens.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); jScrollPane1.setViewportView(txtMensagens); txfMensagem.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N txfMensagem.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); txfMensagem.setEnabled(false); 29 btnEnviar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/enviar.png"))); // NOI18N btnEnviar.setText("Enviar"); btnEnviar.setEnabled(false); btnEnviar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnEnviarActionPerformed(evt); } }); jLabel1.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N jLabel1.setText("Conversas"); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addComponent(jSeparator1) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() 30 .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addComponent(jScrollPane1) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(57, 57, 57) .addComponent(txfMensagem, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATE D) .addComponent(btnEnviar) .addGap(0, 21, Short.MAX_VALUE)))) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnConectar) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnDesconectar, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(12, 12, 12))) .addGap(0, 81, Short.MAX_VALUE)) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addContainerGap() 31 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(lblIp) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATE D) .addComponent(txfIp, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(58, 58, 58) .addComponent(lblPorta, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATE D) .addComponent(txfPorta, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnLoginAnonimo, javax.swing.GroupLayout.PREFERRED_SIZE, 195, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(lblNome) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txfNome, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(96, Short.MAX_VALUE))) 32 ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(45, 45, 45) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.BASELINE) .addComponent(btnConectar) .addComponent(btnDesconectar)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel1) .addGap(1, 1, 1) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 260, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(9, 9, 9) .addComponent(btnEnviar)) .addGroup(jPanel1Layout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 33 .addComponent(txfMensagem, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(88, Short.MAX_VALUE)) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.BASELINE) .addComponent(lblIp) .addComponent(txfIp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblPorta) .addComponent(txfPorta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnLoginAnonimo)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATE D) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.BASELINE) .addComponent(lblNome) .addComponent(txfNome, javax.swing.GroupLayout.PREFERRED_SIZE, 34 javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(338, Short.MAX_VALUE))) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); pack(); }// </editor-fold> private void txfIpActionPerformed(java.awt.event.ActionEvent evt) { } private void txfPortaActionPerformed(java.awt.event.ActionEvent evt) { } private void txfNomeActionPerformed(java.awt.event.ActionEvent evt) { 35 } private void btnConectarActionPerformed(java.awt.event.ActionEvent evt) { if (Conexao == false) { nome = txfNome.getText(); txfNome.setEditable(false); try { sock = new Socket(ip, porta); InputStreamReader streamreader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamreader); writer = new PrintWriter(sock.getOutputStream()); writer.println(nome + ":Conectado.:Conectado"); writer.flush(); Conexao = true; btnDesconectar.setEnabled(true); btnEnviar.setEnabled(true); btnConectar.setEnabled(false); txfMensagem.setEnabled(true); } catch (Exception ex) { txtMensagens.append("Sem Conexao Tente Novamente. \n"); txfNome.setEditable(true); } ListaThread(); 36 } else if (Conexao == true) { txtMensagens.append("Voce Esta Conectado. \n"); } } private void btnDesconectarActionPerformed(java.awt.event.ActionEvent evt) { DesconectarUsuario(); Desconectar(); btnConectar.setEnabled(true); btnEnviar.setEnabled(false); txfMensagem.setEnabled(false); } private void btnEnviarActionPerformed(java.awt.event.ActionEvent evt) { String nothing = ""; if ((txfMensagem.getText()).equals(nothing)) { txfMensagem.setText(""); txfMensagem.requestFocus(); } else { try { writer.println(nome + ":" + txfMensagem.getText() + ":" + "Conversa"); writer.flush(); } catch (Exception ex) { txtMensagens.append("Erro no envio da Mensagem. \n"); 37 } txfMensagem.setText(""); txfMensagem.requestFocus(); } txfMensagem.setText(""); txfMensagem.requestFocus(); } private void btnLoginAnonimoActionPerformed(java.awt.event.ActionEvent evt) { txfNome.setText(""); if (Conexao == false) { String anon="anon"; Random generator = new Random(); int i = generator.nextInt(999) + 1; String is=String.valueOf(i); anon=anon.concat(is); nome=anon; txfNome.setText(anon); txfNome.setEditable(false); try { sock = new Socket(ip, porta); InputStreamReader streamreader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamreader); writer = new PrintWriter(sock.getOutputStream()); writer.println(anon + ":Conectado.:Conectado"); 38 writer.flush();Conexao = true; } catch (Exception ex) { txtMensagens.append("Cannot Connect! Try Again. \n"); txfNome.setEditable(true); } ListaThread(); } else if (Conexao == true) { txtMensagens.append("Voce esta Conectado. \n"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new Cliente().setVisible(true); } }); } } 39 6.2 Servidor public class Servidor extends javax.swing.JFrame { ArrayList clientOutputStreams; ArrayList<String> usuarios; Socket sock; File file ; ServerSocket serverSock ; public class ClientHandler implements Runnable { BufferedReader reader; PrintWriter cliente; public ClientHandler(Socket clientSocket, PrintWriter user) { cliente = user; try { sock = clientSocket; InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(isReader); } catch (Exception ex) { txtArea.append("Erro de Conexao... \n"); } } 40 @Override public void run() { String message, connect = "Conectado", disconnect = "Desconectado", chat = "Conversa" ; String[] data; try { while ((message = reader.readLine()) != null) { txtArea.append("Recebido: " + message + "\n"); data = message.split(":"); } for (String token:data) { txtArea.append(token + "\n"); } if (data[2].equals(connect)) { Transmissao((data[0] + ":" + data[1] + ":" + chat)); AdicionaUsuario(data[0]); } else if (data[2].equals(disconnect)) { Transmissao((data[0] + ":desconectou." + ":" + chat)); RemoverUsuario(data[0]); } else if (data[2].equals(chat)) { Transmissao(message); } 41 else { txtArea.append("As Condicoes Nao Foram Satisfeitas. \n"); } } } catch (Exception ex) { txtArea.append("Conexao Perdida. \n"); clientOutputStreams.remove(cliente); } } } public Servidor() { initComponents(); btnDesligarServidor.setVisible(false); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); txtArea = new javax.swing.JTextArea(); 42 btnIniciar = new javax.swing.JButton(); btnUsuarios = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); txtUser = new javax.swing.JTextArea(); btnDesligarServidor = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Chat - Server's frame"); setName("server"); // NOI18N setResizable(false); jPanel1.setBackground(new java.awt.Color(204, 255, 204)); jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); txtArea.setEditable(false); txtArea.setColumns(20); txtArea.setRows(5); txtArea.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 204), 5)); jScrollPane1.setViewportView(txtArea); btnIniciar.setFont(new java.awt.Font("Times New Roman", 1, 11)); // NOI18N btnIniciar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/conectar.png"))); // NOI18N btnIniciar.setText("Iniciar"); btnIniciar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnIniciarActionPerformed(evt); } }); 43 btnUsuarios.setFont(new java.awt.Font("Times New Roman", 1, 11)); // NOI18N btnUsuarios.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icones/Users.png"))); // NOI18N btnUsuarios.setText("Usuarios Online"); btnUsuarios.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnUsuariosActionPerformed(evt); } }); txtUser.setEditable(false); txtUser.setColumns(20); txtUser.setRows(5); txtUser.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Usuarios Online", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Times New Roman", 1, 12), new java.awt.Color(0, 204, 204))); // NOI18N jScrollPane2.setViewportView(txtUser); btnDesligarServidor.setFont(new java.awt.Font("Times New Roman", 1, 11)); // NOI18N btnDesligarServidor.setText("Desligar"); btnDesligarServidor.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnDesligarServidorActionPerformed(evt); } }); 44 javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(btnIniciar, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnUsuarios)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 45 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) .addComponent(btnDesligarServidor, javax.swing.GroupLayout.Alignment.TRAILING))))) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI NG) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.BASELINE) .addComponent(btnIniciar) .addComponent(btnUsuarios)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Align ment.LEADING) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 219, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 22, Short.MAX_VALUE) .addComponent(btnDesligarServidor)) 46 ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); pack(); }// </editor-fold> private void btnIniciarActionPerformed(java.awt.event.ActionEvent evt) { Thread starter = new Thread(new ServidorIniciado()); starter.start(); btnIniciar.setVisible(false); btnDesligarServidor.setVisible(true); txtArea.append("ServidorIniciado...\n" + "Aguardando Usuarios ...\n "); } private void btnUsuariosActionPerformed(java.awt.event.ActionEvent evt) { usuarios.stream().map((current_user) -> 47 { txtUser.append(current_user+" esta online"+"\n"); return current_user; }).forEach((_item) -> { }); } private void btnDesligarServidorActionPerformed(java.awt.event.ActionEvent evt) { try { int res=JOptionPane.showConfirmDialog(null, "Tem Certeza Que deseja Desligar?\n" + "Todos os Usuarios Serao Desconectados!"); if (res == JOptionPane.YES_OPTION) { serverSock.close(); } System.exit(0); } catch (IOException ex) { Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex); } } public static void main(String args[]) 48 { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new Servidor().setVisible(true); } }); } public class ServidorIniciado implements Runnable { @Override public void run() { clientOutputStreams = new ArrayList(); usuarios = new ArrayList(); try { serverSock = new ServerSocket(2222); while (true) { Socket clientSock = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSock.getOutputStream()); clientOutputStreams.add(writer); Thread listener = new Thread(new ClientHandler(clientSock, writer)); listener.start(); } 49 } catch (Exception ex) { txtArea.append("Erro fazer uma conex\E3o. \n"); } } } public void AdicionaUsuario (String data) { String message, add = ": :Conectado", done = "Servidor: : Conclu\EDdo", name = data; usuarios.add(name); txtArea.append(name + " Conectou-se Com o Servidor. \n"); String[] tempList = new String[(usuarios.size())]; usuarios.toArray(tempList); for (String token:tempList) { message = (token + add); Transmissao(message); } Transmissao(done); } public void RemoverUsuario (String data) { String message, add = ": :Conectado", done = "Servidor: :Concluido", name = data; usuarios.remove(name); String[] tempList = new String[(usuarios.size())]; usuarios.toArray(tempList); for (String token:tempList) 50 { message = (token + add); Transmissao(message); } Transmissao(done); } public void Transmissao(String message) { Iterator it = clientOutputStreams.iterator(); while (it.hasNext()) { try { PrintWriter writer = (PrintWriter) it.next(); writer.println(message); txtArea.append("Diz: " + message + "\n"); writer.flush(); txtArea.setCaretPosition(txtArea.getDocument().getLength()); } catch (Exception ex) { txtArea.append("Erro dizendo a todos. \n"); } } } 51 REFERÊNCIAS BIBLIOGRÁFICAS • ALVES, Sérgio. REDES DE COMPUTADORES: Fundamentos de Redes de Computadores, Transmissão de Dados e Cabeamento. UNIRON. Agosto, 2007 <www.gamaesouza.edu.br/site/ENADE/Redes/fundamentos_comunicac ao_redes.ppt> • Comunicação de dados. <www.ufsm.br/gpscom/professores/. /ComunicacaoDeDados/ComDado s15Renato.pdf> • MARTINS, Elaine. TECMUNDO. O que é TCP/IP? < http://www.tecmundo.com.br/o-que-e/780-o-que-e-tcp-ip-.htm> • Principais Protocolos TCP/IP: Informatica.com. <http://faqinformatica.com/quais-sao-os-protocolos-do-tcpip/> • Programação UDP e TCP sobre "Sockets de Berkeley": <http://www.dei.isep.ipp.pt/~andre/documentos/sockets-berkeley.html> • STEVENS, W. R. 1990, "UNIX Network Programming", Prentice Hall, Englewood Cliffs, New Jersey, 1990. • Sun Microsystems 1990, "Network Programming Guide", Sun Microsystems, Inc., 1990. • TRINDADE, Cristiano. Conexões – O mundo dos sockets. <http://imasters.com.br/artigo/473/java/conexoes-o-mundo-dos- sockets/?trace=1519021197&source=single> http://www.gamaesouza.edu.br/site/ENADE/Redes/fundamentos_comunicac http://www.ufsm.br/gpscom/professores/ http://www.tecmundo.com.br/o-que-e/780-o-que-e-tcp-ip-.htm http://www.tecmundo.com.br/o-que-e/780-o-que-e-tcp-ip-.htm http://faqinformatica.com/quais-sao-os-protocolos-do-tcpip/ http://faqinformatica.com/quais-sao-os-protocolos-do-tcpip/ http://www.dei.isep.ipp.pt/~andre/documentos/sockets-berkeley.html http://imasters.com.br/artigo/473/java/conexoes-o-mundo-dos- http://imasters.com.br/artigo/473/java/conexoes-o-mundo-dos-
Compartilhar