Utilização de Thread em Java com Socket e Criptografia
Boa noite computeros, cá estou eu depois de chegar de mais uma prova (dessa vez eu fui bem, muito bem, 2 em dois pontos), o assunto: Socket, Thread e criptografia…
Tudo a ver né huahuahuahuha, o que importa é que o exercício foi bacana e eu achei de postar pra vocês aqui…
Agora vamos ao que interessa, os fontes…
/*
* ============================================================
* Lucas Felix de Sousa - 736627
* Avaliação Parcial de Técnicas de Programação II - A
* Universidade Cruzeiro do Sul
* http://blog.computero.com.br
* =============================================================
*
* Classe com implementação de Thread, comunicação client-server
* Utilização de Criptografia, Socket e Thread
*
* =============================================================
* */
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerCrypt extends Thread{
private static Vector clientes;
private Socket conexao;
public ServerCrypt(Socket s){
conexao = s;
}
/*Método para criptografar um texto qualquer,
* passando como parâmetro a mensagem em string
* e a chave em inteiro
*/
public static String Crypt(String msg,int n){
String newMsg="";
/*for para deixar os caracteres ao contrario
* exemplo:
* aeiou - uoiea
*/
for (int i=msg.length()-1;i>=0;i--)
{
/*somar a quantidade de digitos (n) ao char*/
newMsg += "" + (char)(msg.charAt(i)+n);
}
//retornando a mensagem criptografada
return(newMsg);
}
/*Método para desciptografar a criptografia anterior
* passando como parâmetro a mensagem a ser descriptografada em String
* e a chave em inteiro
*/
public static String Descrypt(String msg,int n){
String newMsg="";
/*for para deixar os caracteres de volta ao normal
* exemplo:
* uoiea - aeiou
*/
for (int i=msg.length()-1;i>=0;i--)
{
/*subtrair a quantidade de digitos (n) ao char*/
newMsg += "" + (char)(msg.charAt(i)-n);
}
return newMsg;
}
public static void main(String args[]){
clientes = new Vector();
try{
ServerSocket s = new ServerSocket(6666);
while(true){
System.out.print("Esperando alguem se conectar...");
Socket conexao = s.accept();
System.out.println(" Conectou!");
Thread t = new ServerCrypt(conexao);
t.start();
}
}
catch(IOException e){
}
}
public void run(){
try{
//para receber os dados dos clientes
BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
//para enviar os dados para os clientes
PrintStream saida = new PrintStream(conexao.getOutputStream());
//texto padrão ao cliente se conectar
String texto = "
Cliente" + conexao.getInetAddress() + " - " + conexao.getInetAddress().getHostName() + " tenta se comunicar
";
System.out.println(texto + "
Pronto para o envio dos dados...
");
try{
while(true)
{
String strCliente[] = entrada.readLine().toString().split(";");
/*verifica se os dados enviados pelo cliente estão em 3 parâmetros
* opção - crypt ou descrypt (IgnoreCase)
* num - Um digito inteiro entre 0 e 9
* mensagem - uma string com QUALQUER texto, inclusive espaços
*/
if (strCliente.length != 3)
{
saida.println("Formato inválido. [OPCAO;NUM;MENSAGEM]");
}
else
{
try{
int num;
num = Integer.parseInt(strCliente[1]);
/*O número digitado é mudado de acordo com a tabela a seguir:
* num: 0 ou 1 --> A = B (soma 1)
* num: 2 ou 3 --> A = C (soma 2)
* num: 4 ou 5 --> A = D (soma 3)
* num: 6 ou 7 --> A = E (soma 4)
* num: 8 ou 9 --> A = F (soma 5)
*/
if ((num == 0) || (num==1)){
num = 1;
}
else if ((num == 2) || (num==3)){
num = 2;
}
else if ((num == 4) || (num==5)){
num = 3;
}
else if ((num == 6) || (num==7)){
num = 4;
}
else if ((num ==
|| (num==9)){
num = 2;
}
else{
saida.println("Formato do número inválido");
}
/*Verifico qual a opção desejada pelo cliente e devolvo a resposta*/
if (strCliente[0].equalsIgnoreCase("CRYPT")){
saida.println(
Crypt(
strCliente[2],
num
)
);
}
else if(strCliente[0].equalsIgnoreCase("DESCRYPT")){
saida.println(
Descrypt(
strCliente[2],
num
)
);
}
else{
saida.println("Comando inválido, somente [Crypt] e [Descrypt]");
}
}
catch(Exception e)
{
saida.println("Erro ao converter a chave");
}
}
}
}
catch(Exception ex){
}
}
catch(IOException e){
System.out.println("IOException: " + e);
}
}
}
/*
* ============================================================
* Lucas Felix de Sousa - 736627
* Avaliação Parcial de Técnicas de Programação II - A
* Universidade Cruzeiro do Sul
* http://blog.computero.com.br
* =============================================================
*
* Classe com implementação de Thread, comunicação client-server
* Utilização de Criptografia, Socket e Thread
*
* =============================================================
* */
import java.io.*;
import java.net.*;
public class ClientCrypt extends Thread{
private Socket conexao;
//private static boolean done = false;
public ClientCrypt(Socket s) {
conexao = s;
}
public static void main(String args[]){
try{
/*indico a qual computador ele vai se conectar e a qual porta
* lembrando que é recomendável utilizar portas maiores que 1000
* pois as anteriores são reservadas ao Sistema Operacional
*/
Socket conexao = new Socket("localhost", 6666);
Thread t = new ClientCrypt(conexao);
//iniciando a Thread e chamando o método run()
t.start();
}
catch(IOException e){
System.out.println("IOException: " + e);
}
}
public void run(){
try{
//receber os dados do servidor
BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
//receber os dados do teclado
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
//enviar dados para o servidor
PrintStream saida = new PrintStream(conexao.getOutputStream());
while (true)
{
/*Exemplo de utilização:
* Criptografar:
* crypt;7;http://computero.com.br
* Descriptografar:
* descrypt;7;vf2qsg2svixytqsg2kspf33>txxl
*/
System.out.println("Envie a mensagem para o servidor no seguinte formato: [OPCAO;NUM;MENSAGEM], ou FIM para sair");
String str = teclado.readLine();
//se for fim saio do loop
if (str.equalsIgnoreCase("FIM"))
{
break;
}
else
{
//senão envio pro servidor e obtenho a resposta
saida.println(str);
System.out.println("Resposta: " + entrada.readLine() + "
");
}
}
}
catch(IOException e){
}
}
}
Utilização no cliente:
Opção: Crypt ou Descrypt
Num: Números de 0 a 9
Texto: qualquer texto
Exemplo de utilização:
- Criptografar:
crypt;7;http://computero.com.br
- Descriptografar:
descrypt;7;vf2qsg2svixytqsg2kspf33>txxl
Os dois arquivos estão comentados, portanto, qualquer dúvida, já sabem… comentem!