Você com certeza já deve ter ouvido falar em socket, com o avanço tecnológico, houve a necessidade de criar técnicas para se trabalhar com ambientes distribuídos, uma alternativa é a utilização de socket, no nosso mestre google existe milhares de informações sobre esse protocolo vou deixar algumas definições a seguir sobre, mas basicamente é um fluxo de comunicação entre processos através de uma rede de computadores.
O que é socket?
“Um soquete de rede (em inglês: network socket) é um ponto final de um fluxo de comunicação entre processos através de uma rede de computadores. Hoje em dia, a maioria da comunicação entre computadores é baseada no Protocolo de Internet, portanto a maioria dos soquetes de rede são soquetes de Internet.”
Fonte: Wikipedia
“Socket é um ponto de comunicação entre duas máquinas”
Fonte: Oracle
Em resumo, através do socket podemos enviar mensagens entre máquinas, exemplo mensagens de uma máquina X para a máquina Y através de uma conexão estabelecida via socket.
TCP e UDP
Basicamente o que você deve saber entre o protocolo TCP e UDP é que o protocolo TCP é orientado a conexão, isso significa que como protocolo de transporte, antes de iniciar uma troca de dados, eles precisam estabelecer uma conexão, sendo o tráfego seguro, essa segurança é no sentido que ele garante a entrega dos dados entre o emissor e receptor.
Por outro lado o protocolo UDP não é orientado a conexão, é um protocolo mais simples e não é seguro ou seja não fornece a garantia de entrega dos dados, em resumo o receptor envia uma mensagem/informação para o receptor, porém não existe a confirmação se de fato os dados foram recebidos.
Código Socket em UDP
Para o funcionamento do socket em java, nós vamos ter que criar duas classes conforme os modelos abaixo, uma classe que será o Servidor UDP que ficará listening em uma determinada porta, e um cliente UDP para enviar as mensagens.
Criando Servidor UDP
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception {
int porta = 9876;
int numConn = 1;
DatagramSocket serverSocket = new DatagramSocket(porta);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
System.out.println("Esperando por datagrama UDP na porta " + porta);
serverSocket.receive(receivePacket);
System.out.print("Datagrama UDP [" + numConn + "] recebido...");
String sentence = new String(receivePacket.getData());
System.out.println(sentence);
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, port);
System.out.print("Enviando " + capitalizedSentence + "...");
serverSocket.send(sendPacket);
System.out.println("OK\n");
}
}
}
Criando Cliente UDP
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception {
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
DatagramSocket clientSocket = new DatagramSocket();
String servidor = "localhost";
int porta = 9876;
InetAddress IPAddress = InetAddress.getByName(servidor);
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
System.out.println("Digite o texto a ser enviado ao servidor: ");
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, porta);
System.out
.println("Enviando pacote UDP para " + servidor + ":" + porta);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
clientSocket.receive(receivePacket);
System.out.println("Pacote UDP recebido...");
String modifiedSentence = new String(receivePacket.getData());
System.out.println("Texto recebido do servidor:" + modifiedSentence);
clientSocket.close();
System.out.println("Socket cliente fechado!");
}
}
Código Socket em TCP
Agora vamos criar um socket em java, só que agora iremos utilizar o protocolo TCP para a comunicação dessas mensagens, da mesma forma que criamos o socket UDP, vamos criar um servidor TCP e um cliente TCP.
Criando Servidor Socket TCP
import java.io.*;
import java.net.*;
class TCPServer {
public static void main( String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
System.out.println("ponto1");
Socket connectionSocket = welcomeSocket.accept();
while (true) {
System.out.println("ponto2");
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(
connectionSocket.getInputStream()
)
);
DataOutputStream outToClient = new DataOutputStream(
connectionSocket.getOutputStream()
);
System.out.println("ponto3");
clientSentence = inFromClient.readLine();
System.out.println("ponto4");
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
// connectionSocket.close();
}
}
}
Criando Cliente Socket TCP
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception {
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
System.in));
int porta = 6789;
String servidor = "localhost";
System.out.println("Conectando ao servidor " + servidor + ":" + porta);
Socket clientSocket = new Socket(servidor, porta);
DataOutputStream outToServer = new DataOutputStream(clientSocket
.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
System.out.println("Digite string a ser enviada para o servidor");
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("Recebido do servidor: " + modifiedSentence);
clientSocket.close();
}
}
Concluindo
Bom, chegamos ao fim desse tutorial sobre sockets, espero que essa dica tenha contribuído para seu conhecimento, caso tenha alguma dúvida ou até mesmo queira deixar um feedback, e que é muito importante para nós, utilize o formulário de comentários abaixo.
