Prévia do material em texto
UNIVERSIDADE PAULISTA
LUIZ FERNANDO DA SILVEIRA - C26DG15
MARELIZA DA COSTA MENA - C100DA8
WILLIAN DOMINGUES SOUZA - C27AAH0
DESENVOLVIMENTO DE FERRAMENTA PARA COMUNICAÇÃO EM REDE
SOROCABA
2016
LUIZ FERNANDO DA SILVEIRA - C26DG15
MARELIZA DA COSTA MENA - C100DA8
WILLIAN DOMINGUES SOUZA - C27AAH0
DESENVOLVIMENTO DE FERRAMENTA PARA COMUNICAÇÃO EM REDE
Atividades Práticas Supervisionadas
do curso de Ciência da Computação
apresentado à Universidade
Paulista.
Prof. Valdinei Castelan.
SOROCABA
2016
LUIZ FERNANDO DA SILVEIRA - C26DG15
MARELIZA DA COSTA MENA - C100DA8
WILLIAN DOMINGUES SOUZA - C27AAH0
DESENVOLVIMENTO DE FERRAMENTA PARA COMUNICAÇÃO EM REDE
Atividades Práticas Supervisionadas
do curso de Ciência da Computação
apresentado à Universidade
Paulista.
Aprovado:
_______________/_____/______
Prof. Valdinei Castelan.
Universidade Paulista
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
REFERÊNCIAS BIBLIOGRÁFICAS ............................................................... 511
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çãode
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 comunicam utilizando 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”,podemos identificar 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) DO PROGRAMA.
Figura 3: Janela do Cliente
Figura 4: Janela Clientes Logados e enviando mensagens
20
Figura 5: Janela Servidor
Figura 6: Janela servidor iniciado
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.Align
ment.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.ActionEventevt) {
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 = newjavax.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("Servidor Iniciado...\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>