Buscar

APS 5° Semestre

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-

Continue navegando