Programação de socket em
Java
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]Índice
1. Introdução aos sockets
● O que é um socket?
● Tipos de sockets
● Arquitetura cliente-servidor
2. Classes de socket Java
● Classe de socket
● ServerSocket Classe
3. Como funcionam os sockets
● Estabelecendo uma ligação
● Envio e Receção de Dados
● Fechando a ligação
4. Implementando um aplicativo cliente-servidor simples
● Implementação do lado do servidor
● Implementação do lado do cliente
5. Lidando com vários clientes
● Usando threads
● Exemplo: Servidor de Chat Multicliente
6. Boas Práticas
7. Problemas comuns e solução de problemas
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]1. Introdução aos sockets
O que é um socket?
Um socket é um ponto de extremidade para comunicação entre duas máquinas através de
uma rede. Permite que os programas enviem e recebam dados usando uma combinação de
um endereço IP e um número de porta.
Tipos de sockets
● Stream Sockets (TCP): Comunicação fiável e orientada para a ligação. Os
dados são enviados como um fluxo contínuo.
● Sockets de datagrama (UDP): comunicação não confiável e sem ligação. Os
dados são enviados como pacotes individuais.
Arquitetura cliente-servidor
● Servidor: Aguarda conexões de entrada e processa solicitações.
● Cliente: Inicia uma ligação com o servidor para enviar ou receber dados.
2. Classes de socket Java
O Java fornece duas classes principais para programação de socket:
Classe de socket
● Representa o socket do lado do cliente.
● Usado para se conectar a um servidor.
● Metodologia:
○ getInputStream(): Obtém o fluxo de entrada para receber dados.
○ getOutputStream(): Obtém o fluxo de saída para enviar dados.
○ close(): Fecha o socket.
ServerSocket Classe
● Representa o socket do lado do servidor.
● Aguarda por conexões de cliente de entrada.
● Metodologia:
○ accept(): escuta uma ligação e retorna um objeto Socket.
○ close(): Fecha o socket do servidor.
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]3. Como funcionam as sockets
Passos para a Comunicação
1. Servidor:
○ Cria um ServerSocket e o vincula a uma porta específica.
○ Aguarda conexões de cliente usando accept().
○ Uma vez que uma ligação é estabelecida, ele se comunica com o cliente
usando fluxos de entrada / saída.
2. Cliente:
○ Cria um socket e se conecta ao servidor usando o endereço IP e a porta
do servidor.
○ Comunica-se com o servidor usando fluxos de entrada/saída.
3. Intercâmbio de dados:
○ Os dados são enviados e recebidos usando InputStream e OutputStream.
4. Fechando a ligação:
○ O cliente e o servidor fecham seus sockets após a conclusão da
comunicação.
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]4. Implementando um aplicativo cliente-servidor
simples
Implementação do lado do servidor
import java.io.*;
import java.net.*;
public class SimpleServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Server is listening on port 12345...");
Socket socket = serverSocket.accept();
System.out.println("Client connected!");
// Input and output streams
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// Read data from client
String message = in.readLine();
System.out.println("Received from client: " + message);
// Send response to client
out.println("Hello from server!");
// Close resources
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]Implementação do lado do cliente
import java.io.*;
import java.net.*;
public class SimpleClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345)) {
System.out.println("Connected to server!");
// Input and output streams
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// Send data to server
out.println("Hello from client!");
// Read response from server
String response = in.readLine();
System.out.println("Received from server: " + response);
// Close resources
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]5. Tratamento de vários clientes
Para lidar com vários clientes, o servidor deve criar um novo thread para cada
ligação de cliente.
Exemplo de servidor de chat multicliente
import java.io.*;
import java.net.*;
import java.util.*;
public class MultiClientServer {
private static Set<PrintWriter> clientWriters = new HashSet<>();
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Chat Server is running...");
while (true) {
new ClientHandler(serverSocket.accept()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class ClientHandler extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
synchronized (clientWriters) {
clientWriters.add(out);
}
String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
broadcast(message);
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected] try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
synchronized (clientWriters) {
clientWriters.remove(out);
}
}
}
private void broadcast(String message) {
synchronized (clientWriters) {
for (PrintWriter writer : clientWriters) {
writer.println(message);
}
}
}
}
}
6. Melhores práticas
● Sempre feche os sockets e fluxos usando try-with-resources ou,
finalmente, blocos.
● Use threads para lidar com vários clientes.
● Lide com exceções graciosamente (por exemplo, IOException).
● Use a sincronização ao acessar recursos compartilhados (por exemplo,
clientWriters).
7. Problemas comuns e solução de problemas
● ligação recusada: verifique se o servidor está em execução e se a porta
está correta.
● Tempo limite do socket: use setSoTimeout() para manipular tempos
limites.
● Fugas de recursos: feche sempre sockets e fluxos.
● Segurança de threads: use a sincronização quando vários threads
acessarem dados compartilhados.
Escola Básica e Secundária do Padrão da Légua (Escola Sede)
Rua dos Fogueteiros 4460-723 Custóias MTS – TF:229517676
Contribuinte – 600 085 155 - Email :
[email protected]