Skip to content

Instantly share code, notes, and snippets.

@willianrschuck
Last active October 21, 2020 14:27
Show Gist options
  • Save willianrschuck/7cf546aaac29e017cb51227c8fc4a1bd to your computer and use it in GitHub Desktop.
Save willianrschuck/7cf546aaac29e017cb51227c8fc4a1bd to your computer and use it in GitHub Desktop.
Implementação de servidor e cliente em java usando Sockets
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;
}
}
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();
}
}
}
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