English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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úmero | Descrição do método |
1 | public ServerSocket(int port) throws IOException Crie um socket de servidor vinculado a um porta específico. |
2 | public ServerSocket(int port, int backlog) throws IOException Crie um socket de servidor especificado pelo backlog e vincule-o ao porta local especificada. |
3 | public 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. |
4 | public 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úmero | Descrição do método |
1 | public int getLocalPort() Retorna a porta na qual este soquete está escutando. |
2 | public Socket accept() throws IOException Escuta e aceita a conexão deste soquete. |
3 | public void setSoTimeout(int timeout) Ativa através da especificação do valor de timeout/Desativa o SO_TIMEOUT, medido em milissegundos. |
4 | public void bind(SocketAddress host, int backlog) Liga um ServerSocket a um endereço específico (endereço IP e porta). |
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úmero | Descrição do método |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Cria um soquete de fluxo e conecta-o ao host especificado na porta especificada. |
2 | public Socket(InetAddress host, int port) throws IOException Cria um soquete de fluxo e conecta-o ao endereço IP especificado na porta especificada. |
3 | public 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. |
4 | public 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. |
5 | public 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úmero | Descrição do método |
1 | public void connect(SocketAddress host, int timeout) throws IOException Conecta este socket ao servidor e especifica um valor de timeout. |
2 | public InetAddress getInetAddress() Retorna o endereço da conexão do socket. |
3 | public int getPort() Retorna o número de porta remota a que este socket está conectado. |
4 | public int getLocalPort() Retorna o número de porta local ao qual este socket está ligado. |
5 | public SocketAddress getRemoteSocketAddress() Retorna o endereço do ponto de extremidade da conexão do socket, se não estiver conectado, retorna null. |
6 | public InputStream getInputStream() throws IOException Retorna a entrada de dados deste socket. |
7 | public OutputStream getOutputStream() throws IOException Retorna a saída de dados deste socket. |
8 | public void close() throws IOException Fechar este socket. |
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úmero | Descrição do método |
1 | static InetAddress getByAddress(byte[] addr) No caso de um endereço IP original fornecido, retorna um objeto InetAddress. |
2 | static InetAddress getByAddress(String host, byte[] addr) Cria um InetAddress com o nome de host e o endereço IP fornecidos. |
3 | static InetAddress getByName(String host) Determina o endereço IP do host para um nome de host dado. |
4 | String getHostAddress() Retorna a string do endereço IP (em representação textual). |
5 | String getHostName() Obtém o nome do host deste endereço IP. |
6 | static InetAddress getLocalHost() Retorna o host local. |
7 | String toString() Converta este endereço IP em String. |
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(); } } }
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!