Os modelos de aplicativos de rede incluem principalmente:
www (World Wide Web) é um sistema de navegação de informações baseado no modelo cliente/servidor, baseado na linguagem HTML e no protocolo HTTP, podendo fornecer diversos serviços de Internet. As informações da rede são colocadas em diferentes locais do host, e o servidor www usa links de hipertexto para vincular várias informações. O cliente www (navegador) é responsável por estabelecer contato com o servidor, enviar solicitações ao servidor, processar hipermídia HTML, fornecer interface gráfica de usuário (GUI), exibir informações, etc.
No modo de trabalho cliente/servidor, no lado do servidor, esteja preparado para aceitar comunicações de vários computadores clientes. Para tanto, além de usar endereços IP para identificar computadores na Internet, também são introduzidos números de porta para identificar threads que atendem serviços em segundo plano no lado do servidor. A combinação do número da porta e do endereço IP é chamada de soquete de rede.
Na implementação do modo C/S na linguagem Java, os soquetes são divididos em duas categorias:
A máquina Servidora fornece serviços para a máquina Cliente através de portas (endereços de E/S de barramento); a máquina Servidora fornece vários serviços diferentes ao mesmo tempo em suas diversas portas; O Cliente acessa uma determinada porta do Servidor e solicita ao Servidor que o atenda através desta porta. Regulamentos: Os números de porta 0~1023 são para uso exclusivo do sistema. Por exemplo, o protocolo HTTP está na porta 80 e o protocolo telnet está na porta 23. As portas 1024~65535 são usadas pelos aplicativos.
Quando o programa Cliente e o programa Servidor precisam se comunicar, a classe Socket pode ser usada para estabelecer uma conexão de soquete. Pense em uma conexão de soquete como uma chamada telefônica: inicialmente o programa Cliente estabelece a chamada e o programa Servidor escuta após a chamada ser concluída, qualquer uma das partes pode falar a qualquer momento;
Existem duas maneiras opcionais de obter comunicação entre as duas partes: soquete de streaming e soquete de datagrama:
O soquete de streaming estabelece um canal de comunicação entre o programa Cliente e o programa Servidor. Cada soquete pode realizar operações de leitura e gravação. Para qualquer uma das extremidades, o processo de sessão de comunicação com a outra parte é:
Estabeleça uma conexão de soquete, obtenha fluxos de entrada/saída, leia/grave dados e feche o soquete (desmanche a conexão) após a conclusão da comunicação.
Usando o construtor socket, um objeto socket pode ser estabelecido no lado do cliente para o servidor:
Socket (String host, int port): host é o endereço IP do servidor, port é o número da porta, estes são pré-acordados.
Por exemplo, código:
tente{Socket meuSocket = new Socket(“http://www.weixueyuan.net” ,1860 }catch(IOException e){}
Em seguida, use o método getInputStream() para obter o fluxo de entrada, use este fluxo de entrada para ler as informações colocadas pelo servidor na "linha"; use o método getOutputStream() para obter o fluxo de saída e use este fluxo de saída para; escreva informações na "linha".
Usando o construtor ServerSocket, você pode criar um objeto de soquete de servidor no servidor que aceita soquetes de cliente:
ServerSocket(int port): Especifique o número da porta e crie um objeto ServerSocket. O número da porta port deve ser igual ao número da porta chamada pelo cliente. Para fazer isso, use o seguinte formato de código:
tente{ ServerSocket serverSocket = new ServerSocket(1860);
O programa do lado do servidor escuta na porta especificada Ao receber uma solicitação de serviço do programa Cliente, ele cria um objeto de soquete para se comunicar com o programa Cliente correspondente à porta. Por exemplo, após executar o código acima para criar um objeto de soquete de servidor e estabelecer o objeto serverSocket, ele pode usar o método accept() para obter o objeto Socket e receber as informações do programa cliente do soquete mySocket. Conforme mostrado no código a seguir:
try{ Socket sc = serverSocket.accept();//ac é um objeto Socket}catch(IOException e){}
Para revogar o serviço, você pode fechar o objeto Socket sc:
sc.close();
[Exemplo] Aplicação cliente em modo C/S. Este é um exemplo simples de comunicação de soquete de streaming do lado do cliente. O código ilustra como escrever o programa do lado do cliente. No exemplo, o programa Cliente faz uma solicitação para a porta 4441 do host do servidor. Após a conexão ser estabelecida, ele conclui a leitura e gravação no servidor.
importar java.io.*;importar java.net.*;classe pública Cliente{ public static void main(String args[]){ String s = null;Socket mySocket in = null;DataOutputStream out = null; = new Socket("localhost",4441); entrada = novo DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("bom servidor!"); while(true){ s = in.readUTF(); ); } mySocket.close(); }catch(IOException e){ System.out.println(“não é possível conectar”);
[Exemplo] Aplicação do lado do servidor correspondente à aplicação do lado do cliente. O programa escuta na porta 4441. Quando uma solicitação do cliente é detectada, uma string contendo "Cliente, olá, eu sou o servidor" é gerada e enviada ao cliente.
import java.io.*;import java.net.*;public class Server{ public static void main(String args[]){ ServerSocket server = null;String s = null; in = null; tente{ servidor = new ServerSocket(4441 }catch(IOException e1){ system.out.println("ERRO:" +e1); } tentar{ você = server.accept(); in = new DataInputStream(you.getInputStream()); ); if(s!=null) break; } out.writeUTF("Olá cliente, sou o servidor"); e){System.out.println(“ERRO:”+e);} }}
Para aproveitar ao máximo a capacidade de funcionamento paralelo do computador, o trabalho de conexão do soquete pode ser concluído por um thread. Quando o cliente solicita ao servidor a prestação de serviços, ou quando o servidor recebe uma solicitação de serviço do cliente, ele inicia um thread dedicado a completar a comunicação de informações, cria um fluxo de entrada e saída neste thread e completa a troca de informações entre o cliente e o servidor.
[Exemplo] Um miniaplicativo cliente que coloca o trabalho de conexão de soquete em um thread. A interface possui um botão para enviar mensagem, uma caixa de texto e uma área de texto. O aplicativo cliente primeiro estabelece uma conexão de soquete com o servidor. Use o fluxo de entrada de dados para ler repetidamente as informações colocadas na linha pelo servidor e exibir as informações recebidas na área de texto. Se a informação recuperada for "end", a conexão do soquete será fechada e o programa será encerrado. O usuário também pode inserir informações na caixa de texto e pressionar o botão enviar informações, e o programa cliente usa o fluxo de saída de dados para enviar o conteúdo da caixa de texto ao servidor.
importar java.net.*;importar java.io.*;importar java.awt.*;importar javax.swing.*;importar java.awt.event.*;importar java.applet.*;classe pública Aclient estende implementos de miniaplicativo Executável,ActionListener{ botão JButton; JTextField textF; JTextArea Socket Thread; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); 20,30);setSize(450.350); p.add(textF); p.add(botão); add(textA,"Centro"); add(p,"Sul"); novo Socket(this.getCodeBase().getHost(),4441); entrada = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n"); ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); }catch(IOException e1){} } else{ try{ out.writeUTF("Por favor, fale" } catch(IOException e1){} } } }}
[Exemplo] O programa usa o terminal 4441 para estabelecer uma conexão de soquete com o cliente. Após o servidor receber a solicitação do cliente, ele cria um thread com o soquete do cliente e o inicia. Se não houver nenhum aplicativo do cliente, continue monitorando os aplicativos do cliente. O thread estabelece o fluxo de dados de entrada e o fluxo de dados de saída de acordo com o soquete do cliente. O thread usa in para ler as informações que o cliente coloca na linha. Se a informação recebida for “End”, o servidor responde “End” e a seguir fecha a conexão do soquete; caso contrário, responde: “Eu sou o servidor que você me disse”, e a informação recebida pelo servidor.
importar java.net.*;importar java.io.*;importar java.awt.*;importar javax.swing.*;importar java.awt.event.*;importar java.applet.*;classe pública Aclient estende implementos de miniaplicativo Executável,ActionListener{ botão JButton; JTextField textF; JTextArea Socket Thread; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); 20,30);setSize(450.350); p.add(textF); p.add(botão); add(textA,"Centro"); add(p,"Sul"); novo Socket(this.getCodeBase().getHost(),4441); entrada = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n"); ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); }catch(IOException e1){} } else{ try{ out.writeUTF("Por favor, fale");