Sei sulla pagina 1di 15

Sockets

Marco Antonio marcoreis.net Arquiteto de Software Dezembro/2007

Introduo
A estrutura Socket foi uma inovao apresentada pelo sistema Berkeley Unix. Atravs desta estrutura, o programador por ler e gravar bytes como uma stream qualquer de dados. Alm disto, esconde os detalhes de baixo nvel das redes tais como tipo de transmisso, tamanho de pacote, retransmisso e etc.

Objetivos
Estabelecer conexes entre mquinas Enviar e receber dados Encerrar conexes Esperar por conexes em determinada porta

As classes
Os sockets esto localizados no pacote java.net. Basicamente precisamos das classes Socket e ServerSocket para conseguir implementar uma aplicao bsica A classe Socket implementa o socket cliente. Para construir um socket precisamos saber qual o IP que desejamos conectar e a porta de conexo (que varia de 0 a 65535) A classe ServerSocket fornece a interface de rede necessria para que a aplicao possa funcionar como um servidor TCP Para criar um ServerSocket precisamos saber qual a porta que ser utilizada. Comumente utiliza-se portas acima de 1000 pois as inferiores so utilizadas pelo sistema operacional

Exemplo
Para ilustrar o uso dos sockets, iremos construir uma aplicao bastante simples para comunicao de dois computadores. Um computador ficar aguardando alguma conexo e ir exibir em tela o que foi recebido.

Servidor
Um servidor nada mais que um programa que fica ouvindo uma das portas do computador

Servidor
package net.stream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Servidor { public static void main(String[] args) { try { 1. ServerSocket serverSocket = new ServerSocket(4444); 2. Socket clientSocket = serverSocket.accept(); 3. BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 4. System.out.println(in.readLine()); } catch (Exception e) { e.printStackTrace(); } } }

Passo a passo
1. Abre a porta 4444. Se a mesma no estiver disponvel, sua aplicao vai cair 2. Fica ouvindo a porta at que seja enviada alguma stream pelo cliente. Sua aplicao ficar parada nesse ponto at que o cliente envie os dados 3. Armazena em um buffer os dados que o cliente envia 4. Imprime a linha enviada pelo cliente

Cliente
O cliente ir se conectar na porta aberta pelo servidor e enviar uma mensagem Para abrir um socket cliente, voc pode usar esse cdigo
Socket MyClient; MyClient = new Socket("Machine name", PortNumber);

Cliente
package net.stream; import java.io.PrintWriter; import java.net.Socket; public class Cliente { public static void main(String[] args) { try { 1. Socket echoSocket = new Socket("localhost", 4444); 2. PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); 3. out.println("Oi"); } catch (Exception e) { e.printStackTrace(); } } }

Detalhes
1. Abre um socket com o servidor localhost na porta 4444 2. PrintWriter (lembra dela?) abre um canal de comunicao no outputStream do socket, ou seja, escreve no destino (localhost:4444). O primeiro parmetro indica se tem flush. Como true, o flush est ativado 3. Manda um Oi para o outro lado do socket

Um exemplo mais completo


No exemplo anterior o cliente envia uma linha de texto para o servidor e a execuo acaba Neste prximo exemplo temos um loop e a execuo s acaba quando o cliente digita Bye.

Servidor
package net.stream; import java.net.*; import java.io.*; public class KnockKnockServer { public static void main(String[] args) throws IOException { try { ServerSocket serverSocket = new ServerSocket(4444); Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Server: " + inputLine); if (inputLine.equals("Bye.")) { //Se alguem enviar um "Bye" o programa acaba break; } } in.close(); clientSocket.close(); serverSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }

Cliente
package net.stream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class EchoClient { public static void main(String[] args) throws IOException { try { Socket echoSocket = new Socket("localhost", 4444); PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput = null; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); } out.close(); stdIn.close(); echoSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }

Dvidas?

Potrebbero piacerti anche