Este artigo descreve um aplicativo cliente simples do lado do servidor de programação de rede Java. Compartilhe com todos para sua referência. Os detalhes são os seguintes:
Em Java, usamos java.net.Socket e suas classes relacionadas para completar funções relacionadas à rede. A classe Socket é muito simples e fácil de usar porque a tecnologia Java oculta o complexo processo de estabelecimento de uma conexão de rede e envio de dados por meio da conexão. O que é dito abaixo se aplica apenas ao protocolo TCP.
1. Conecte-se ao servidor
Podemos usar o construtor da classe Socket para abrir um soquete, como
Soquete sk = novo Soquete("210.0.235.14",13);
Entre eles, 210.0.235.14 é um objeto String decimal pontilhado, representando o endereço IP (ou nome do host) do host de destino, e 13 representa a porta 13 designada para conectar-se ao host de destino. O 210.0.235.14 aqui é um servidor de cronometragem localizado em Hong Kong. A porta padrão do servidor de cronometragem é geralmente 13.
Observe que o programa é bloqueado até que ele se conecte com êxito ao servidor.
A seguir, você pode usar o método getInputStream() da classe Socket para obter um objeto InputStream. Por meio deste objeto, você pode obter as informações enviadas para nós pelo host de destino:
InputStream inStream = sk.getInputStream();
Da mesma forma, para enviar dados ao host de destino, você pode chamar o método getOutputStream() para obter um objeto de fluxo de saída.
O exemplo de função a seguir é conectar-se ao servidor de cronometragem e imprimir as informações retornadas na saída padrão:
try { Socket sk = new Socket("210.0.235.14",13); InputStream inStream = sk.getInputStream(); / Imprime dados no console while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Saída: " + str); ) {e.printStackTrace();
O método setSoTimeout() no código pode definir o tempo limite, ou seja, se as operações de leitura e gravação não forem concluídas após o tempo definido, uma SocketTimeoutException será lançada e a conexão poderá ser fechada capturando esta exceção.
Há também um problema de timeout que deve ser resolvido, que é o construtor da classe Socket.
novo Socket(host,porta);
Ele será bloqueado indefinidamente até que uma conexão com o host de destino seja estabelecida com êxito. Certamente não é isso que queremos. Podemos resolver esse problema ligando para:
Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//Defina o tempo limite para 2 segundos
2. Obtenha o endereço do host
O método estático getByName(hostname) da classe InetAddress pode retornar um objeto InetAddress que representa um endereço de host. Este objeto inclui uma sequência de 4 bytes, que é o endereço IP do host. Em seguida, chame o método getHostAddress() para retornar um objeto String representando o endereço IP.
Alguns nomes de host com alto volume de tráfego geralmente correspondem a vários endereços IP para obter balanceamento de carga. Podemos obter todos os endereços de host chamando o método getAllByName(), que retorna um array de objetos InetAddress.
A seguir está um pequeno programa simples. A função é imprimir o endereço IP local se nenhum parâmetro for definido na linha de comando. Se um nome de host for especificado, todos os endereços IP do host serão impressos:
pacote cls; import java.net.*; public class ShowIP { public static void main(String[] args) { try { if(args.length > 0) { String hostName = args[0]; ] addr = InetAddress.getAllByName(hostName); //Obter todos os endereços do host //Imprimir a saída para o console for(InetAddress address : addr) { System.out.println(address.getHostAddress()); else { System.out.println(InetAddress.getLocalHost().getHostAddress()); }
3. Programa do lado do servidor
Os aplicativos do lado do servidor usam a classe ServerSocket para criar um soquete e vinculá-lo à porta local, como
Meia ServerSocket = novo ServerSocker(8000);
O método sock.accept() permite que o programa aguarde uma conexão continuamente. Este método só retornará um objeto Socket representando uma nova conexão quando um cliente estiver conectado, ou seja, este método irá bloquear.
Aqui geralmente é necessário abrir um novo thread para cada conexão para atendê-lo.
A seguir está um exemplo completo. O servidor aguarda uma conexão na porta 8400. Sempre que uma conexão chega, um novo thread é aberto para atendê-la e as informações da conexão são gravadas no arquivo de log:
pacote cls; importar java.io.*; importar java.net.*; importar public class ServerDemo { /** * @param args */ public static void main(String[] args) { tentar { //ServerSocket servSocket = new ServerSocket(8000); ServerSocket servSocket = new ServerSocket(8400); while(true) { Socket client = servSocket.accept(); ++amount Data time = new Date(); ).getHostAddress() + "Connected/n"; System.out.print(prompt); //Saída de informações no console ServerDemo.writeLog(prompt); //Escrever no arquivo//iniciar um novo Thread Th = new Thread(new ServThread(client,amount)); th.start(); Grave no arquivo de log public static void writeLog(String str) { File logFile = new File("server-log.txt"); FileWriter(logFile,true); out.append(str); out.close(); catch(Exception e) { e.printStackTrace(); Cliente de soquete; private int ix; public ServThread(Socket soc,int ix) { cliente = soc; { tente {InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Algumas palavras! [Digite 'tchau' para fechar a conexão]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("Até mais mais tarde ~ ^-^"); break; } send.println("Este é um programa de teste, ainda não possui funções"); } Date time = new Date(); String prompt = time.toString() + ": usuário" + ix + "th" + client.getInetAddress().getHostAddress() + "Desconectado/n"; /Escrever no arquivo client.close(); catch(Exception e) { e.printStackTrace();
Este programa foi colocado no servidor. Você pode usar o comando telnetyouthol.tk 8400 para experimentar os resultados da execução deste programa.
Espero que este artigo seja útil para a programação Java de todos.