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.