Criar datagram socket em UDP e socket TCP em Java

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.