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].