Java - Sockets

De Aulas

Afluentes: Programação em Java

Definição

  • Um socket[1] é um mecanismo de comunicação entre dois programas que ocorre nos dois sentidos em uma rede de computadores.
  • O pacote java.net contém duas classes, a Socket que implementa o cliente e a ServerSocket que implementa o servidor em uma conexão.
  • O java.net esconde os detalhes específicos de cada sistema.

Funcionamento

  • Uma aplicação servidor é executada em uma determinada máquina e tem um socket ligado a uma porta específica dessa máquina.
  • O servidor espera que um cliente faça um pedido de conexão por meio desse socket.
  • O servidor ao aceitar a conexão e cria um novo socket para uma porta diferente (e assim permite novas conexões)
  • No lado do cliente um socket é criado e é usado para a comunicação com o servidor (numa porta disponível na máquina cliente).

Exemplo de Programa Servidor

 1import java.io.*;
 2import java.net.*;
 3
 4public class MyServer extends Thread {
 5	private ServerSocket sock;
 6
 7	public MyServer(int port) {
 8		super();
 9		try {
10			// Inicializa o socket
11			sock = new ServerSocket(port);
12			System.out.println("MyServer running at port " + port);
13		} catch (IOException e) {
14			System.out.println("Error: couldn't create socket.");
15			System.exit(1);
16		}
17	}
18
19	// Execução da thread
20	public void run() {
21		Socket client = null;
22
23		while (true) {
24			if (sock == null)
25				return;
26			try {
27				// Aguarda um cliente se conectar
28				client = sock.accept();
29
30				// Recebe a mensagem do cliente e imprime na tela
31				BufferedReader in = new BufferedReader(
32					new InputStreamReader(client.getInputStream()));
33				String c = in.readLine();
34				System.out.println(c);
35
36				// Envia uma resposta ao cliente
37				BufferedOutputStream bos = new BufferedOutputStream(
38					client.getOutputStream());
39				PrintWriter os = new PrintWriter(bos, false);
40				os.println("return of '" + c + "'");
41				os.flush();
42
43				// Efetua e feecha a conexão
44				os.close();
45				client.close();
46			} catch (IOException e) {
47				System.out.println("Error: couldn't connect to client.");
48				System.exit(1);
49			}
50		}
51	}
52
53	public static void main(String[] arguments) {
54		// Define a porta 4000 como default
55		int port = 4000;
56		// Se o usuário digitar uma porta como parâmetro
57		if (arguments.length == 1) {
58			// Assume essa porta para a conexão
59			port = Integer.parseInt(arguments[0]);
60		}
61		// Instancia o Servidor
62		MyServer server = new MyServer(port);
63		// Como é uma thread, inicia a execução dela
64		server.start();
65	}
66}

Exemplo de Programa Cliente

 1import java.io.*;
 2import java.net.*;
 3
 4public class MyClient {
 5    public static void main(String[] arguments) {
 6        // Pega 3 parâmetros, o host, a porta e a mensagem
 7        String host;
 8        String port;
 9        String mesg;
10        if (arguments.length == 3) {
11            host = arguments[0];
12            port = arguments[1];
13            mesg = arguments[2];
14        } else {
15            System.out.println("Usage: java MyClient host port message");
16            return;
17        }
18        try {
19            // Efetua a conexão com o servidor
20            Socket sock = new Socket(host, Integer.parseInt(port));
21            sock.setSoTimeout(20000);
22
23            // Envia uma mensagem para o servidor
24            BufferedOutputStream bos = new BufferedOutputStream(
25                sock.getOutputStream());
26            PrintWriter os = new PrintWriter(bos, false);
27            os.println(mesg);
28            os.flush();
29
30            // Aguarda uma resposta do servidor e imprime na tela
31            BufferedReader in = new BufferedReader(
32                new InputStreamReader(sock.getInputStream()));
33            boolean eof = false;
34            while (!eof) {
35                String line = in.readLine();
36                if (line != null)
37                    System.out.println(line);
38                else
39                    eof = true;
40            }
41
42            // Fecha a conexão
43            sock.close();
44        } catch (IOException e) {
45            System.out.println("IO Error: " + e.getMessage());
46        }
47    }
48}

Datagrama

  • Stream (TCP): existe uma ligação entre cliente e servidor (iniciada, mantida e terminada).
    • Vantagem: confiável
    • Desvantagem: velocidade
  • Datagrama (UDP): mensagem independente cuja entrega, tempo e conteúdo não sãog arantidos
    • Vantagem: rapidez
    • Desvantagem: não confiável

O Java tem as classes DatagramPacket e DatagramSocket no pacote java.net que implementam a comunicação de Datagramas sobre o UDP[2].

Referências