English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Manual Básico de Java

Controle de fluxo do Java

Array do Java

Java Orientação a Objetos (I)

Java Orientação a Objetos (II)

Java Orientação a Objetos (III)

Tratamento de Exceção Java

Java Lista (List)

Java Queue (Fila)

Conjuntos Java Map

Conjuntos Java

E/S do Java (Input/Output)/O)

Reader do Java/Writer

Outros tópicos do Java

Programação de Rede Java

Programação de rede é a escrita de programas que executam em vários dispositivos (computadores), que estão conectados através de uma rede.

O pacote java.net contém J2As APIs do SE contêm classes e interfaces que fornecem detalhes de comunicação de baixa camada. Você pode usar diretamente essas classes e interfaces para se concentrar em resolver problemas, sem se preocupar com os detalhes de comunicação.

O pacote java.net oferece suporte a dois protocolos de rede comuns:

  • TCP:TCP (English: Transmission Control Protocol, Protocolo de Controle de Transmissão) é um protocolo de comunicação de camada de transmissão orientado a conexão, confiável e baseado em fluxo de bytes, localizado entre a camada IP e a camada de aplicativo. O TCP garante a comunicação confiável entre dois aplicativos. Geralmente usado no protocolo de internet, conhecido como TCP / IP.

  • UDP:UDP (English: User Datagram Protocol, Protocolo de Datagrama de Usuário), localizado na camada de transmissão do modelo OSI. Um protocolo sem conexão. Fornece datagramas para que os aplicativos enviem dados. Devido à falta de confiabilidade do UDP e à sua natureza sem conexão, os aplicativos geralmente devem permitir algumas perdas, erros ou pacotes repetidos.

Este tutorial principal aborda os seguintes dois tópicos.

  • Programação de Socket:É o conceito de rede mais amplamente utilizado, que foi explicado em detalhes.

  • Tratamento de URL:Esta parte será abordada em outro capítulo, clique aqui para obter mais detalhes sobre Tratamento de URL em Java.

Programação de Socket

Os soquetes usam TCP para fornecer um mecanismo de comunicação entre dois computadores. O programa cliente cria um soquete e tenta se conectar ao soquete do servidor.

Quando a conexão for estabelecida, o servidor criará um objeto Socket. Agora, o cliente e o servidor podem se comunicar através da escrita e leitura no objeto Socket.

A classe java.net.Socket representa um socket e a classe java.net.ServerSocket fornece um mecanismo para o programa do servidor monitorar clientes e estabelecer conexões com eles.

Os seguintes passos ocorrem ao estabelecer uma conexão TCP entre duas máquinas usando sockets:

  • O servidor cria um objeto ServerSocket para representar a comunicação através da porta no servidor.

  • O servidor chama o método accept() da classe ServerSocket, que espera até que o cliente se conecte ao porta fornecida no servidor.

  • Enquanto o servidor está esperando, um cliente cria um objeto Socket, especificando o nome do servidor e a porta para solicitar a conexão.

  • O construtor da classe Socket tenta conectar o cliente ao servidor e porta especificados. Se a comunicação for estabelecida, um objeto Socket é criado no cliente para se comunicar com o servidor.

  • No lado do servidor, o método accept() retorna uma nova referência de socket no servidor, conectada ao socket do cliente.

Após a conexão ser estabelecida, através do uso de I/No fluxo de comunicação, cada socket tem um fluxo de saída e um fluxo de entrada. O fluxo de saída do cliente está conectado ao fluxo de entrada do servidor, e o fluxo de entrada do cliente está conectado ao fluxo de saída do servidor.

TCP é um protocolo de comunicação bidirecional, portanto, os dados podem ser enviados por dois fluxos de dados ao mesmo tempo. Abaixo estão um conjunto completo de métodos úteis fornecidos pelas classes para implementar socket.

Métodos da classe ServerSocket

O aplicativo do servidor usa a classe java.net.ServerSocket para obter uma porta e escutar solicitações de clientes.

A classe ServerSocket tem quatro métodos construtores:

NúmeroDescrição do método
1public ServerSocket(int port) throws IOException
Crie um socket de servidor vinculado a um porta específico.
2public ServerSocket(int port, int backlog) throws IOException
Crie um socket de servidor especificado pelo backlog e vincule-o ao porta local especificada.
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Crie um servidor usando a porta especificada, o backlog de escuta e o endereço IP local a ser vinculado.
4public ServerSocket() throws IOException
Cria um servidor de soquete não-bindado.

Cria um servidor de soquete não-bindado. Se o método construtor do ServerSocket não lançar uma exceção, isso significa que seu aplicativo já foi bindsucesso ao porta especificada e está escutando por solicitações de clientes.

Aqui estão alguns métodos comuns da classe ServerSocket:

NúmeroDescrição do método
1public int getLocalPort()
  Retorna a porta na qual este soquete está escutando.
2public Socket accept() throws IOException
Escuta e aceita a conexão deste soquete.
3public void setSoTimeout(int timeout)
 Ativa através da especificação do valor de timeout/Desativa o SO_TIMEOUT, medido em milissegundos.
4public void bind(SocketAddress host, int backlog)
Liga um ServerSocket a um endereço específico (endereço IP e porta).

Métodos da classe Socket

A classe java.net.Socket representa o soquete utilizado tanto pelo cliente quanto pelo servidor para comunicação mútua. O cliente obtém um objeto Socket através da instância, enquanto o servidor obtém um objeto Socket através do valor de retorno do método accept().

A classe Socket possui cinco métodos construtores.

NúmeroDescrição do método
1public Socket(String host, int port) throws UnknownHostException, IOException.
Cria um soquete de fluxo e conecta-o ao host especificado na porta especificada.
2public Socket(InetAddress host, int port) throws IOException
Cria um soquete de fluxo e conecta-o ao endereço IP especificado na porta especificada.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Cria um soquete e conecta-o ao host remoto especificado na porta remota especificada.
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Cria um socket e o conecta ao endereço remoto especificado na porta remota especificada.
5public Socket()
Cria um socket não conectado usando o tipo de SocketImpl padrão do sistema

Quando o método construtor do Socket retorna, ele realmente tenta se conectar ao servidor e ao número de porta especificados.

A seguir estão listados alguns métodos de interesse, note que tanto o cliente quanto o servidor têm um objeto Socket, então tanto o cliente quanto o servidor podem chamar esses métodos.

NúmeroDescrição do método
1public void connect(SocketAddress host, int timeout) throws IOException
Conecta este socket ao servidor e especifica um valor de timeout.
2public InetAddress getInetAddress()
 Retorna o endereço da conexão do socket.
3public int getPort()
Retorna o número de porta remota a que este socket está conectado.
4public int getLocalPort()
Retorna o número de porta local ao qual este socket está ligado.
5public SocketAddress getRemoteSocketAddress()
Retorna o endereço do ponto de extremidade da conexão do socket, se não estiver conectado, retorna null.
6public InputStream getInputStream() throws IOException
Retorna a entrada de dados deste socket.
7public OutputStream getOutputStream() throws IOException
Retorna a saída de dados deste socket.
8public void close() throws IOException
Fechar este socket.

Métodos da classe InetAddress

Esta classe representa o endereço de protocolo da Internet (IP). A seguir estão listados métodos úteis para programação de Socket:

NúmeroDescrição do método
1static InetAddress getByAddress(byte[] addr)
No caso de um endereço IP original fornecido, retorna um objeto InetAddress.
2static InetAddress getByAddress(String host, byte[] addr)
Cria um InetAddress com o nome de host e o endereço IP fornecidos.
3static InetAddress getByName(String host)
Determina o endereço IP do host para um nome de host dado.
4String getHostAddress() 
Retorna a string do endereço IP (em representação textual).
5String getHostName() 
 Obtém o nome do host deste endereço IP.
6static InetAddress getLocalHost()
Retorna o host local.
7String toString()
Converta este endereço IP em String.

Exemplo de cliente Socket

O seguinte GreetingClient é um programa cliente que se conecta ao servidor via socket, envia uma solicitação e espera uma resposta.

// Nome do arquivo GreetingClient.java
 
import java.net.*;
import java.io.*;
 
public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      1]
      try
      {
         System.out.println("Conectado ao host: ") + serverName + ",porta: ") + port);
         Socket client = new Socket(serverName, port);
         System.out.println("Endereço do host remoto:") + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
 
         out.writeUTF("Olá de ") + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         System.out.println("Resposta do servidor: ") + in.readUTF());
         client.close();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Exemplo de Servidor Socket

O seguinte programa GreetingServer é uma aplicação de servidor, que usa Socket para ouvir uma porta específica.

// Nome do arquivo GreetingServer.java
 
import java.net.*;
import java.io.*;
 
public class GreetingServer extends Thread
{
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }
 
   public void run()
   {
      while(true)
      {
         try
         {
            System.out.println("Aguardando conexão remota, porta: ") + serverSocket.getLocalPort() + "..."
            Socket server = serverSocket.accept();
            System.out.println("Endereço do host remoto:") + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Obrigado por se conectar comigo:" + server.getLocalSocketAddress() + "\nGoodbye!");
            server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = Integer.parseInt(args[0]);
      try
      {
         Thread t = new GreetingServer(port);
         t.run();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Compile os dois arquivos java acima e execute o seguinte comando para iniciar o serviço, usando a porta: 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
Aguardando conexão remota, porta:6066...

Abra uma nova janela de comando e execute os seguintes comandos para iniciar o cliente:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
Conectando ao Host: localhost,Porta:6066
Endereço de Host Remoto: localhost/127.0.0.1:6066
Resposta do Servidor: Obrigado por conectar-se a mim:/127.0.0.1:6066
Adeus!