Java – Dicas: TCP Socket com Java

Hoje uma dica rápida e bem bacana, principalmente para quem está passando ou ainda vai passar (e até pra quem já passou e quer ver uma abordagem diferenciada) pela disciplina “Programação Avançada” no curso de Ciência da Computação. É provável que vocês vejam alguma aplicação utilizando sockets para comunicar-se via rede. Na UNIVALE, nossa turma viu esse conteúdo montando pequenas aplicações utilizando componentes Delphi.

Bom, o que eu trago pra vocês é uma implementação bem basicona de socket TCP em Java. O objetivo foi abstrair o funcionamento interno do socket em java e oferecer um JAR onde tivessem as classes cliente e servidor prontas para serem utilizadas. Mas daí já implementei uma interfacezinha e coloquei no projeto. Basta, como eu disse, importar o JAR que está em um dos links abaixo para seu projeto, instanciar a classe SocketServidor ou SocketCliente, de acordo com a necessidade, e implementar a classe interface que faz a interoperabilidade com a GUI que você criou. Mais ou menos da seguinte maneira:

public class ExemploGUIServidor extends javax.swing.JFrame {

private SocketCliente cliente = null;
private SocketServidor servidor = null;
private Interface frame;

public ExemploGUIServidor() {
initComponents();
frame = new Interface();
}

/* Esta é a classe que se precisa implementar
servidor.SocketInterface ou cliente.SocketInterface
dependo da necessidade. */

class Interface implements servidor.SocketInterface {
@Override
public void enviarMensagem(String msg) {
if (cliente != null)
cliente.enviarMensagem(msg);
else
servidor.enviarMensagem(msg);
}

@Override
public void msgRecebida(String msg) {
dialogo.setText(dialogo.getText() + msg + "\n");
}

@Override
public void fecharSocket() {
if (cliente != null)
servidor.fecharSocket();
else
cliente.fecharSocket();
}
}
...
... //Resto do código da GUI

O resultado está no link abaixo, aproveite! ‘-’

Baixar projeto.

Qualquer dúvida na implementação ou se se interessar mais pelo assunto e quiser saber mais ou ainda sugerir algo, fique à vontade para se manifestar. Meu TCC está sendo desenvolvido nesta área, então pra mim será ótimo trocar informações sobre o assunto.

MySQL Engines: InnoDB ou MyISAM ?

O MySQL, como acontece com todos os softwares livres, permite ao usuário ajustá-lo e adequa-lo para extrair dele o máximo dentro dos objetivos do negócio. Nesse processo de “afinação” da ferramenta, surge a escolha entre as diversas engines disponíveis para se manipular os dados no MySQL. Dentre estas, estão as duas principais engines utilizadas hoje, InnoDB e MyISAM, e é aí que vem a dúvida: qual delas utilizar?

Não é de hoje que essa dúvida tem gerado muita confusão na hora de formar opinião sobre essas engines e definir qual utilizar. Apesar disso, é relativamente fácil distinguir as duas e identificar qual a melhor na sua aplicação, baseando-se em uma análise superficial e levando em conta que seu negócio não envolve análises mais profundas do funcionamento da engine que você necessita. Basta atentar-se para algumas características básicas de cada uma.

MyISAM

  • A performance aumenta inversamente proporcional ao número de escritas no banco, ou seja, quanto menos se grava no banco, maior a performance dessa engine. Ideal para bancos onde os dados sofrem pouca ou nenhuma interação, mas há intenso processo de leitura.
  • É uma engine bem mais simples se comparada ao InnoDB, o que resulta em uma facilidade maior de se conseguir ferramentas que trabalhem com essa engine ou até mesmo “escrever” sua própria ferramenta para manipular e otimizar a engine. (Free as a freedom! *-*)
  • Os arquivos de dados e os logs também são mais simples, com isso acabam sendo menores que os do InnoDB.

InnoDB

  • Adiciona ao MySQL suporte a TRANSACTIONS e relacionamento com FOREIGN KEY CONSTRAINTS. Portanto, se as tabelas do seu banco necessitam de relacionamento e/ou você implementa transações, MyISAM não server pra você.
  • Por sua natureza transacional, os dados são atualizados mais rapidamente e com maior nível de segurança, além de processos de backup serem efetuados de forma simples e rápida. Em condições normais, para efetuar um backup de tabelas MyISAM, é necessário parar o banco para fazê-lo, pois não existe um processo de backup definido nativamente na engine (ainda).
  • É fortemente ACID (Atomicity, Consistency, Isolation, Durability), ou seja, foi construído para garantir consistência e durabilidade dos dados.

Com base nestas informações básicas sobre as duas engines e já derrubando o mito de que “InnoDB é mais lento que MyISAM” (não é bem assim, tudo depende do modus operandi), é provável que você já mate muitas dúvidas sobre o assunto e até possível já definir sua engine.

Lembre-se, esteja sempre livre para mudar! Livre como em LIBERDADE!!! \o/

Linux: Shell Falso, Bloquear Login de Usuário

Hoje é 1º de abril! \o/ Falando nisso, o post de hoje é bem relacionado com esta data. Quem teve falta do que fazer coragem de perder tempo aqui começar a ler não se preocupe, o post não é de mentira, mas o objetivo dele é ensinar você à aplicar um “1º de abril” básico em um usuário intruso.

Bom, em outro post eu resumi algumas características de um shell e citei que o usuário precisa de um pra criar um sessão no Linux. Disse também que o shell padrão é o bash e nos exemplos que mostrei, vocês viram que ele fica no diretório /bin. Bacana até aí. Acontece que existem diversos outros shells e alguns com objetivos específicos. Um deles é o /bin/false. Isso mesmo, false. Ele é um shell fake que não faz simplesmente nada quando o usuário tenta logar e carregar esse shell, retornando (o shell) um código de falha de modo que o usuário volta à tela de login. Outro é o /sbin/nologin. Este é mais elegante, avisando o usuário que “Essa conta não está disponível!”. Se o nologin estiver no diretório /etc, então somente o usuário root conseguirá logar no sistema. Qualquer outro usuário terá o conteúdo desse arquivo como resposta e o login falhará.

Dito isto, quem tem mais tranquilidade para editar os arquivos de configurações do Linux pode setar um destes shells para o usuário alvo no arquivo /etc/passwd (Red Hat e derivados) ou /etc/shadown (Debian e derivados). Quem não tem, pode alterar o shell através do comando usermod da seguinte maneira:

# usermod -s /bin/false fulano

# usermod -s /sbin/nologin fulano

Você pode também apenas bloquear o usuário utilizando o parâmetro -L deste mesmo comando

# usermod -L fulano

e quando o usuário tentar logar, terá “Senha incorreta.” como resposta. Desbloqueie com -U

# usermod -U funalo

e não se esqueça de que o Linux é case sensitive, os parâmetros são maiúsculos.