Last active
October 21, 2020 14:27
-
-
Save willianrschuck/7cf546aaac29e017cb51227c8fc4a1bd to your computer and use it in GitHub Desktop.
Implementação de servidor e cliente em java usando Sockets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.io.BufferedReader; | |
| import java.io.PrintStream; | |
| public class Cliente { | |
| private static int sequenceId = 1; | |
| private Integer id; | |
| private String ip; | |
| private String nome; | |
| private PrintStream saida; | |
| private BufferedReader entrada; | |
| public Cliente(String ip, BufferedReader entrada, PrintStream saida) { | |
| this.id = sequenceId++; | |
| this.ip = ip; | |
| this.entrada = entrada; | |
| this.saida = saida; | |
| } | |
| public Integer getId() { | |
| return id; | |
| } | |
| public String getIp() { | |
| return ip; | |
| } | |
| public BufferedReader getEntrada() { | |
| return entrada; | |
| } | |
| public PrintStream getSaida() { | |
| return saida; | |
| } | |
| public void setNome(String nome) { | |
| this.nome = nome; | |
| } | |
| public String getNome() { | |
| return nome; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.io.BufferedReader; | |
| import java.io.InputStreamReader; | |
| import java.io.PrintStream; | |
| import java.net.Socket; | |
| public class ClienteSocket extends Thread { | |
| private static boolean conexaoEstaAtiva = true; | |
| private Socket conexao; | |
| public ClienteSocket(Socket conexao) { | |
| this.conexao = conexao; | |
| } | |
| @Override | |
| public void run() { | |
| try { | |
| BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream())); | |
| String mensagemRecebida; | |
| while (true) { | |
| mensagemRecebida = entrada.readLine(); | |
| System.out.println(mensagemRecebida); | |
| if (mensagemRecebida == null) { | |
| System.out.println("Conexão encerrada!"); | |
| conexaoEstaAtiva = false; | |
| break; | |
| } | |
| } | |
| } catch (Exception e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| public static void main(String[] args) { | |
| try { | |
| String ip = "localhost"; | |
| Integer port = 3500; | |
| Socket conexao = new Socket(ip, port); | |
| BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); | |
| PrintStream saida = new PrintStream(conexao.getOutputStream()); | |
| /* | |
| * Essa thread vai cuidar do recebimento de mensagens. Sem ela o programa | |
| * ficaria parado esperando o usuário digitar algo e não leria corretamente as | |
| * mensagens enviadas pelo servidor | |
| */ | |
| new ClienteSocket(conexao).start(); | |
| /* O envio de mensagens pelo cliente é executado pelo main */ | |
| String mensagem; | |
| while (conexaoEstaAtiva) { | |
| mensagem = teclado.readLine(); | |
| if (mensagem.trim().isEmpty()) { | |
| break; | |
| } | |
| saida.println(mensagem); | |
| } | |
| conexao.close(); | |
| } catch (Exception e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.io.BufferedReader; | |
| import java.io.IOException; | |
| import java.io.InputStreamReader; | |
| import java.io.PrintStream; | |
| import java.net.InetSocketAddress; | |
| import java.net.ServerSocket; | |
| import java.net.Socket; | |
| import java.util.ArrayList; | |
| import java.util.List; | |
| public class ServidorSocket extends Thread { | |
| private static List<Cliente> clients = new ArrayList<Cliente>(); | |
| private Cliente cliente; | |
| public ServidorSocket(Cliente cliente) { | |
| this.cliente = cliente; | |
| } | |
| @Override | |
| public void run() { | |
| try { | |
| String mensagemRecebida = cliente.getEntrada().readLine(); | |
| while (!(mensagemRecebida == null || mensagemRecebida.isEmpty())) { | |
| if (mensagemRecebida.startsWith("/")) { // Comandos são inciados com / | |
| String comando = mensagemRecebida.replaceFirst("/", ""); | |
| if (comando.equalsIgnoreCase("listar")) { | |
| cliente.getSaida().println("LISTANDO USUARIOS"); | |
| for (Cliente c : clients) { | |
| cliente.getSaida().println(c.getIp() + " - " + c.getNome()); | |
| } | |
| } | |
| if (comando.startsWith("setnome")) { | |
| String nome = comando.replaceFirst("setnome", "").trim(); | |
| cliente.setNome(nome); | |
| } | |
| if (comando.startsWith("terminal")) { | |
| String comandoTerminal = comando.replaceFirst("terminal", "").trim(); | |
| try { | |
| Process exec = Runtime.getRuntime().exec(comandoTerminal); | |
| BufferedReader saidaDoComando = new BufferedReader(new InputStreamReader(exec.getInputStream())); | |
| String saida = saidaDoComando.readLine(); | |
| while (saida != null) { | |
| cliente.getSaida().println(saida); | |
| saida = saidaDoComando.readLine(); | |
| } | |
| } catch (Exception e) { | |
| cliente.getSaida().println(e.getLocalizedMessage()); | |
| } | |
| } | |
| } else { | |
| if (cliente.getNome() == null) { | |
| cliente.getSaida().println("Antes de enviar mensagens você deve setar o seu nome\nUtilize /setnome [nome]"); | |
| } else { | |
| broadcastMessage(cliente, mensagemRecebida); | |
| } | |
| } | |
| mensagemRecebida = cliente.getEntrada().readLine(); | |
| } | |
| broadcastMessage(cliente, "SAIU do chat"); | |
| System.out.println("Cliente desconectou-se..."); | |
| } catch (IOException e) { | |
| e.printStackTrace(); | |
| broadcastMessage(cliente, "SAIU do chat devido a um erro"); | |
| } | |
| clients.remove(cliente); | |
| } | |
| public static void main(String[] args) { | |
| try { | |
| @SuppressWarnings("resource") | |
| ServerSocket server = new ServerSocket(3500); | |
| System.out.println("Servidor iniciado"); | |
| while (true) { | |
| System.out.println("Aguardando cliente..."); | |
| Socket conexao = server.accept(); | |
| InetSocketAddress address = (InetSocketAddress) conexao.getRemoteSocketAddress(); | |
| String enderecoDoCliente = address.getAddress().getHostAddress(); | |
| System.out.println("Cliente se conectou... " + enderecoDoCliente); | |
| BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream())); | |
| PrintStream saida = new PrintStream(conexao.getOutputStream()); | |
| Cliente cliente = new Cliente(enderecoDoCliente, entrada, saida); | |
| clients.add(cliente); | |
| Thread novaThread = new ServidorSocket(cliente); | |
| novaThread.start(); | |
| } | |
| } catch (IOException e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| public void broadcastMessage(Cliente emissor, String linha) { | |
| for (Cliente cliente : clients) { | |
| PrintStream saidaDoCliente = cliente.getSaida(); | |
| if (cliente != emissor) { | |
| saidaDoCliente.println(emissor.getNome() + ": " + linha); | |
| } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment