Programación de red JavaSE

1. Introducción a la programación en red

Red informática

Interconecte computadoras distribuidas en diferentes áreas geográficas con equipos externos especializados en un sistema de red potente y de gran escala con líneas de comunicación, para que muchas computadoras puedan transferir fácilmente información entre sí, compartir hardware, software, datos y otros recursos

El propósito de la programación de red.

Intercambio de datos directo o indirecto y comunicación con otras computadoras a través de protocolos de red

2. Elementos de comunicación de red.

2.1 IP

  • Identifique de manera única las computadoras en Internet
  • Dirección de bucle de retorno local (hostAddress): 127.0.0.1 Nombre de host (hostName): localhost
  • Clasificación de dirección IP 1: IPV4 e IPV6
    • IPV4: 4 bytes, 4 0 ~ 255, alrededor de 4,2 mil millones, se utilizaron en 2011
    • IPV6: 16 bytes (128 bits), escritos como 8 enteros sin signo
  • Método de clasificación de dirección IP 2: dirección de red pública (World Wide Web) y dirección privada (utilizada en LAN)
    • 192.168 comienza con una dirección privada, el rango es 192.168.0.0-192.168.255.255

2.2 Número de puerto

  • Los diferentes procesos tienen diferentes números de puerto
  • 0 ~ 65535
  • Clasificación de puertos
    • Puerto conocido: 0 ~ 1023
    • Puerto registrado: 1024 ~ 49151
    • Puerto dinámico / privado: 49152 ~ 65535

La combinación de número de puerto y dirección IP --- Socket de red: Socket

2.3 Clase InetAddress

  • Hay dos formas para que los hosts en Internet representen direcciones
    • Nombre de dominio: www.google.com
    • Dirección IP: 196.128.0.1
  • La clase InetAddress representa principalmente la dirección IP, dos subclases: Inet4Address, Inet6Address
  • El objeto de clase InetAddress contiene el nombre de dominio y la dirección IP de una dirección de host de Internet
  • Después de ingresar el nombre de dominio de un host cuando se conecta a la red, el servidor de nombres de dominio (DNS) es responsable de convertir el nombre de dominio en una dirección IP para que se pueda establecer una conexión con el host. ------- Resolución de nombre de dominio
  • Métodos comunes de InetAdress
    • public String getHostAddress (): devuelve la cadena de la dirección IP (en forma de texto)
    • public String getHostName (): obtiene el nombre de host de esta dirección IP
    • public boolean isReachable (int timeout): prueba si se puede llegar a la dirección

2.4 Protocolo de comunicación de red

Debe haber algunas convenciones para realizar la comunicación en la red informática, es decir, el protocolo de comunicación, que establece los estándares de velocidad, código de transmisión, estructura de código, pasos de control de transmisión, control de errores, etc.

Protocolo de comunicación en capas

Al formular un acuerdo, los componentes complejos se dividen en componentes simples y luego se combinan. El método compuesto más utilizado es el método jerárquico, es decir, la misma capa puede comunicarse, la capa superior puede llamar a la siguiente capa y no hay relación con la siguiente capa. Cada capa no se afecta entre sí, lo que favorece el desarrollo y la expansión del sistema.

Clúster de protocolo TCP / IP

Hay dos protocolos muy importantes en el protocolo de la capa de transporte.

  • Protocolo de control de transmisión (TCP)
  • Protocolo de datagramas de usuario (UDP)

TCP / IP lleva el nombre de sus dos protocolos principales: Protocolo de control de transmisión (TCP) y Protocolo de interconexión de red (IP). En realidad, es un conjunto de protocolos, que incluye múltiples protocolos con diferentes funciones y relacionados entre sí

El protocolo IP (Protocolo de Internet) es el protocolo principal de la capa de red y admite la comunicación de datos entre Internet.

Desde una perspectiva más práctica, el modelo de protocolo TCP / IP ha formado una arquitectura eficiente de cuatro capas, a saber, la capa de enlace físico, la capa IP, la capa de transporte y la capa de aplicación

Enchufe

El uso de sockets (Socket) para desarrollar aplicaciones de red ha sido ampliamente adoptado, por lo que se ha convertido en el estándar de facto

La dirección IP y el número de puerto identificados de forma exclusiva en la red se pueden combinar para formar un socket identificador identificable de forma única

Ambos extremos de la comunicación deben tener Socket, que es el punto final de comunicación entre las dos máquinas. La comunicación de red es en realidad la comunicación entre Socket

Socket permite que el programa trate la conexión de red como una secuencia, y los datos se transfieren entre los dos Sockets a través de IO

Generalmente, el programa de aplicación que inicia activamente la comunicación pertenece al cliente, y el servidor que espera la solicitud de comunicación es el servidor.

Clasificación de Scoket

  • Socket de flujo: use TCP para proporcionar un servicio confiable de flujo de bytes
  • Enchufe de datagrama: use UDP para proporcionar el servicio de datagrama de "mejor esfuerzo"

3. Programación de red TCP

  • Antes de usar el protocolo TCP, se debe establecer una conexión TCP para formar un canal de transmisión de datos
  • Antes de la transmisión, se adopta el método de "apretón de manos de tres vías" para la comunicación punto a punto, que es confiable
  • Dos procesos de aplicación que se comunican usando el protocolo TCP: cliente y servidor
  • Se pueden transferir grandes cantidades de datos durante la conexión
  • Una vez completada la transmisión, la conexión establecida debe liberarse, lo cual es ineficiente

Programación TCP para que el cliente cree un socket

  • Crear zócalo
  • Abra el flujo de entrada / salida conectado al zócalo
  • Operaciones de lectura / escritura en Socket de acuerdo con cierto protocolo
  • Cerrar zócalo
Socket s = new Socket(“192.168.40.165”,9999);
OutputStream out = s.getOutputStream();
out.write(" hello".getBytes()); 
s.close();

El servidor establece el objeto ServerSocket

  • Llame a ServerSocket (puerto int)
  • Llamar aceptar ()
  • Llame a getOutputStream () y getInputStream () del objeto de clase Socket
  • Cierre los objetos ServerSocket y Socket
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept (); 
InputStream in = s.getInputStream(); 
byte[] buf = new byte[1024]; 
int num = in.read(buf); 
String str = new String(buf,0,num); System.out.println(s.getInetAddress().toString()+”:”+str); 
s.close(); 
ss.close();

3.1 Programación TCP basada en Socket

package cn.imut;

import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

@SuppressWarnings("all")
public class TCPTest {
    public static void main(String[] args) {

    }

    @Test
    public void client() {
        Socket socket = null;
        OutputStream os = null;
        try {
            InetAddress inet = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inet, 8899);

            os = socket.getOutputStream();
            os.write("你好,我是客户端".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void server() {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        try {
            ss = new ServerSocket(8899);
            socket = ss.accept();

            is = socket.getInputStream();
            //不建议这样写
//        byte[] buffer = new byte[20];
//        int len;
//        while ((len = is.read(buffer)) != -1) {
//            String str = new String(buffer,0,len);
//            System.out.println(str);
//        }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[20];
            int len;
            while ((len = is.read(buffer)) != -1) {
                String str = new String(buffer,0,len);
                System.out.println(str);
            }
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Cuatro, programación de red UDP

  • Encapsula datos, origen y destino en paquetes de datos sin conectarse
  • El tamaño de cada datagrama está limitado a 64 K
  • Independientemente de si la otra parte está lista o no, el receptor no confirma el recibo, por lo que no es confiable
  • Puede ser transmitido
  • No es necesario liberar recursos al final del envío de datos, con baja sobrecarga y velocidad rápida

Las clases DatagramSocket y DatagramPacket implementan programas de red basados ​​en el protocolo UDP. Los datagramas UDP se envían y reciben a través de DatagramSocket DatagramSocket. El sistema no garantiza que los datagramas UDP se puedan entregar de forma segura a sus destinos, ni pueden determinar cuándo pueden alcanzar el paquete de objetos DatagramPacket Datagrama UDP, que contiene la dirección IP y el número de puerto del extremo emisor y la dirección IP y el número de puerto del extremo receptor

Cada datagrama en el protocolo UDP proporciona información de dirección completa, por lo que no es necesario establecer una conexión entre el emisor y el receptor. Como enviar un paquete

Remitente

DatagramSocket ds = null;
try { 
    ds = new DatagramSocket();
    byte[] by = "hello,atguigu.com".getBytes(); 
    DatagramPacket dp = new DatagramPacket(by, 0, by.length, InetAddress.getByName("127.0.0.1"), 10000); 
    ds.send(dp); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (ds != null) 
        ds.close(); 
}

Receptor

DatagramSocket ds = null; 
try { 
    ds = new DatagramSocket(10000);
    byte[] by = new byte[1024];
    DatagramPacket dp = new DatagramPacket(by, by.length); 
    ds.receive(dp); 
    String str = new String(dp.getData(), 0, dp.getLength()); 
    System.out.println(str + "--" + dp.getAddress()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (ds != null) 
        ds.close(); 
}

Supongo que te gusta

Origin www.cnblogs.com/yfyyy/p/12735998.html
Recomendado
Clasificación