Notas de estudio de JAVA: programación de red

1. Concepto

TCP: necesita confirmación de la otra parte para establecer la conexión

UDP: solo envíalo, no te preocupes por la otra parte

1.1 Red informática

Una red informática se refiere a la conexión de varias computadoras y sus dispositivos externos con funciones independientes en diferentes ubicaciones geográficas a través de líneas de comunicación, con la administración y asistencia de sistemas operativos de red, software de administración de red y protocolos de comunicación de red , intercambio de recursos y sistemas informáticos para la transferencia de información.

1.2 Propósito de la programación de la red

Por ejemplo: intercambio de datos de estaciones de radio (información de transmisión)

1.3 ¿Qué se necesita para lograr este efecto?

¿Cómo localizar un host en la red?

  • La dirección IP y el número de puerto del host (ubicación de un recurso en el host)

    ¿Cómo transferir datos después de encontrar este host?

  • JavaWeb: programación web (B/S)

  • Programación de red: TCP/IP (C/S)

2. Elementos de comunicación de la red.

¿Cómo lograr la comunicación en red?

  • Direcciones de ambas partes que se comunican: dirección IP y número de puerto
  • Reglas: Protocolo de comunicación en red (modelo de referencia TCP/IP)

Modelo de red de siete capas OSI

Modelo conceptual de cuatro capas TCP/IP

resumen:

1. Hay dos problemas principales en la programación de redes.

  • Cómo localizar con precisión uno o más hosts en la red
  • Cómo comunicarse después de encontrar al anfitrión

2. Elementos en la programación de redes

  • IP y número de puerto
  • Protocolo de comunicación de red

3. Todo es un objeto (clase IP, clase TCP)

3. PI

API correspondiente a la dirección IP: InetAddress

  • Localizar de forma única una computadora en red
  • 127.0.0.1: servidor local

Clasificación de direcciones IP:

  • Ordenar por dirección IP
    • ipv4: por ejemplo, 127.0.0.1, consta de cuatro bytes, cada byte tiene una longitud de 0 a 255 (4200 millones, todos usados ​​en 2011)
    • ipv6: por ejemplo 240e:33d:2f9a:6600:948c:bd86:7d89:e527, hay ocho enteros sin signo para representar 128 bits.
  • Según la clasificación red pública-red privada (la red del campus pertenece a la red privada)
    • dirección de clase ABCD
    • 192.168.xx.xx es exclusivamente para uso interno de la organización (LAN)
    • La red privada también se llama LAN

Razones del nacimiento del nombre de dominio:

  • Resuelve el problema de la dirección IP de la memoria.
//测试IP
public class TestInetAddress {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            //查询本机地址
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
            InetAddress inetAddress3 = InetAddress.getByName("localhost");
            InetAddress inetAddress4 = InetAddress.getLocalHost();
            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            //常用方法
            System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getHostName());//域名:或者自己电脑的名字

            System.out.println(inetAddress1);
            System.out.println(inetAddress2);
            System.out.println(inetAddress3);
            System.out.println(inetAddress4);
        } catch (UnknownHostException e) {
    
    
            throw new RuntimeException(e);
        }
    }
}

4. Puerto

Un puerto representa el proceso de un programa en una computadora.

  • Diferentes procesos tienen diferentes números de puerto para distinguir el software.
  • Un programa especificado para ejecutarse en una computadora: 0-65535
  • Cada protocolo puede ejecutar esta cantidad (TCP, UDP: 65535*2)
  • Los programas de diferentes protocolos pueden tener el mismo número de puerto, pero los programas del mismo protocolo no pueden tener el mismo número de puerto, de lo contrario habrá un conflicto.

Clasificación portuaria:

  • Puerto público 0-1023
  • HTTP: 80
  • HTTPS: 443
  • FTP: 21
  • Talento: 23

Puerto de registro de programa 1024-49151 (usado para asignar usuarios y programas)

  • Tomcat: 8080
  • MySQL: 3306
  • Oráculo: 1521

Puerto dinámico y privado 49152-65535

//查看所有程序进程端口
netstat -ano

//查看某个具体的端口(用来检测哪个端口冲突)
netstat -ano|findstr "3306"

//查看指定端口的进程
tasklist|findstr "8696"

¿Cuál es la diferencia entre PID y número de puerto?

  • Un número de puerto es un identificador único asignado a cada proceso por el sistema.
  • pid es la identidad de cada proceso. Tan pronto como se ejecuta el programa, el sistema asignará automáticamente un pid único al proceso. Una vez finalizado el proceso, el sistema recicla el pid y puede continuar asignándolo a programas recién ejecutados;

Configure la dirección de mapeo de esta máquina: (¿Para qué se utiliza?)

Al acceder a un sitio web en Internet, primero debemos resolver el nombre de dominio de la red (similar a www.xx.com) en una dirección IP a través de un servidor de nombres de dominio DNS antes de que nuestra computadora pueda acceder a él. Si tenemos que esperar a que el servidor de nombres de dominio resuelva y devuelva información de IP para cada solicitud de nombre de dominio, la eficiencia del acceso a la red se reducirá y el archivo Hosts puede mejorar la eficiencia de la resolución. De acuerdo con las regulaciones del sistema Windows, antes de realizar una solicitud de DNS, el sistema Windows primero verificará si existe dicha relación de asignación de direcciones en su archivo Hosts. Si es así, llamará a la asignación de direcciones IP. De lo contrario, propondrá un nombre de dominio. resolución a un servidor DNS conocido. En otras palabras, el nivel de solicitud de Hosts es mayor que el de DNS.

5. Protocolo de comunicación

Acuerdo: Acuerdo, como el mandarín que hablamos en el trabajo.

Protocolo de comunicación de red: velocidad de transmisión…

Clúster de protocolos TCP/IP: es la base de Internet y la forma de red más popular en la actualidad. TCP/IP es sinónimo de un grupo de protocolos, incluidos muchos otros protocolos, que forman el conjunto de protocolos TCP/IP. Los más importantes incluyen el protocolo SLIP, el protocolo PPP, el protocolo IP, el protocolo ICMP, el protocolo ARP, el protocolo TCP, el protocolo UDP, el protocolo FTP, el protocolo DNS, el protocolo SMTP, etc.

Varios acuerdos importantes:

  • TCP: protocolo de transporte de usuarios
  • UDP: Protocolo de datagramas de usuario

Protocolos notables:

  • tcp
  • IP: Protocolo de Internet

Comparación entre TCP y UDP:

TCP: hacer una llamada telefónica

  • conexión, estabilidad
  • Tres apretones de manos y cuatro saludos
三次握手(最少需要三次来保证稳定连接)
A:你瞅啥!
B:瞅你咋地!
A:干一场!

四次挥手
A:我要走了
B:你真的要走了吗
B:你真的真的要走了吗
A:我真的要走了

  • Servidor de cliente
  • Establecer una conexión, completar la transmisión, liberar la conexión, baja eficiencia

UDP: enviar SMS

  • No requiere conexión, inestable
  • Cliente, servidor (el límite no es muy claro)
  • El "misil" tiene un objetivo claro, independientemente de si el oponente está dispuesto a lanzarlo.
  • Ataque de inundación DDOS (los mensajes de texto no deseados bloquean la línea)

6.TCP

Llamada: conexión establecida - transferencia completada - conexión destruida

6.1 Flujo de trabajo del protocolo TCP

  1. cliente
    • Conectarse al servidor Socket
    • Enviar un mensaje
//客户端
public class TcpClientDemo01 {
    
    
    public static void main(String[] args) {
    
    
        Socket socket = null;
        OutputStream os = null;
        try {
    
    
            //1. 要知道服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //2. 端口号
            int port = 9999;
            //3. 创建一个socket 连接
            socket = new Socket(serverIP,port);
            //4. 发生消息 IO流
            os = socket.getOutputStream();
            os.write("你好,世界".getBytes());
        } catch (IOException e) {
    
    
            throw new RuntimeException(e);
        } finally {
    
    
            if(socket!=null){
    
    
                try {
    
    
                    socket.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
            if(os!=null){
    
    
                try {
    
    
                    os.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
        }

    }
}

Servidor

  • Crear puerto de servidor ServerSocket
  • Esperando la conexión del usuario aceptar()
  • Recibir mensajes de usuario
//服务端
public class TcpServerDemo01 {
    
    
    public static void main(String[] args) {
    
    
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
    
    
            //1. 我有一个地址
            serverSocket = new ServerSocket(9999);
            while(true){
    
    
                //2. 等待客户端连接过来
                socket = serverSocket.accept();
                //3. 读取客户端的消息
                is = socket.getInputStream();
                //管道流 字符流
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while((len=is.read(buffer))!=-1){
    
    
                    baos.write(buffer,0,len);
                }
                System.out.println(baos.toString());
            }
            /*
            byte[] buffer = new byte[1024];
            int len;
            while((len=is.read(buffer))!=-1){
                String msg = new String(buffer,0,len);
                System.out.println(msg);
            }
            */

        } catch (IOException e) {
    
    
            throw new RuntimeException(e);
        } finally {
    
    
            //关闭资源
            if(baos!=null){
    
    
                try {
    
    
                    baos.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
            if(is!=null){
    
    
                try {
    
    
                    is.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
            if(socket!=null){
    
    
                try {
    
    
                    socket.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
            if(serverSocket!=null){
    
    
                try {
    
    
                    serverSocket.close();
                } catch (IOException e) {
    
    
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

Primero inicie el servidor para escuchar y recibir el mensaje, luego el cliente envía el mensaje de acuerdo con la dirección correspondiente y el servidor responderá tan pronto como reciba la conexión.

6.2 Carga de archivos

Terminal de servicio

public class TcpServerDemo02 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //1. 创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2. 监听客户端连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //3. 获取输入流
        InputStream is = socket.getInputStream();
        //4. 文件输出
        FileOutputStream fos = new FileOutputStream(new File("/Users/xay/Desktop/编程/JAVA-FullStack/JavaSE/receive.jpg"));
        byte[] bytes = new byte[1024];
        int len;
        while((len=is.read(bytes))!=-1){
    
    
            fos.write(bytes,0,len);
        }
        //通知客户端接受完毕
        OutputStream os = socket.getOutputStream();
        os.write("文件接受完毕,可以断开连接".getBytes());
        //5. 关闭资源
        os.close();
        fos.close();;
        is.close();
        socket.close();
        serverSocket.close();
    }
}

cliente

public class TcpClientDemo02 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //1. 创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2. 创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3. 读取文件
        FileInputStream fis = new FileInputStream(new File("/Users/xay/Desktop/编程/JAVA-FullStack/JavaSE/baidu1.jpg"));
        //4. 写出文件
        byte[] bytes = new byte[1024];
        int len;
        while((len = fis.read(bytes))!=-1){
    
    
            os.write(bytes,0,len);
        }
        //通知服务器,我已经结束
        socket.shutdownOutput();//我已传输完成

        //确定服务器接收完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        //String byte[];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bytes2 = new byte[1024];
        int len2;
        while((len2 = inputStream.read(bytes2))!=-1){
    
    
            baos.write(bytes2,0,len2);
        }
        System.out.println(baos.toString());
        //5. 关闭
        baos.close();
        inputStream.close();
        fis.close();
        os.close();
        socket.close();
    }
}

7. Gato

  1. cliente
    • Cliente personalizado C
    • Navegador C
  2. Servidor
    • Personalización del lado del servidor S
    • Gato S

Reponer:

  • .bat es un archivo ejecutable en el sistema Windows
  • .sh es un archivo ejecutable en el sistema Linux

8.UDP

8.1 Envío de mensajes UDP

Enviar SMS: no es necesario conectarse, ¡solo necesita saber la dirección de la otra parte!

  1. Remitente (puede ser cliente o servidor)
//不需要连接服务器
public class UdpClientDemo01 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1. 建立一个Socket
        DatagramSocket socket = new DatagramSocket();
        //2. 建个包
        //发生给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        //数据,数据长度起始,结束,要发送给谁
        String msg = "你好,服务器!";
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
        //3. 发送包
        socket.send(packet);
        //4. 关闭流
        socket.close();
    }
}
  1. Receptor (puede ser un cliente o un servidor)
//服务器端,开放端口,还是要等待客户端的连接
public class UdpServerDemo01 {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接受数据包
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);//接收
        socket.receive(packet);//阻塞接收
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭连接
        socket.close();
    }
}

8.2 Consulta

final del envío

public class UdpSenderDemo01 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据:控制台读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while(true){
    
    
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
            socket.send(packet);
            if(data.equals("bye")){
    
    
                break;
            }
        }
        socket.close();
    }
}

Extremo de recepción

public class UdpReceiveDemo02 {
    
    
    public static void main(String[] args) throws Exception {
    
    
        DatagramSocket socket = new DatagramSocket(6666);
        while(true){
    
    
            //准备接受包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container,0,container.length);
            socket.receive(packet);//阻塞式接收包裹
            //断开连接 bye
            byte[] data = packet.getData();
            String receiveData = new String(data, 0, packet.getLength());
            System.out.println(receiveData);
            if(receiveData.equals("bye")){
    
    
                break;
            }
        }
        socket.close();
    }
}

8.3 UDP realiza consultas en línea de subprocesos múltiples

final del envío

public class TalkSend implements Runnable {
    
    
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private int fromPort;
    private String toIp;
    private int toPort;

    public TalkSend(int fromPort, String toIp, int toPort) {
    
    
        this.fromPort = fromPort;
        this.toIp = toIp;
        this.toPort = toPort;
        try{
    
    
            socket = new DatagramSocket(fromPort);
            //准备数据:控制台读取
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
    
    
        while (true) {
    
    
            String data = null;
            try {
    
    
                data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp, this.toPort));
                socket.send(packet);
                if (data.equals("bye")) {
    
    
                    break;
                }
            } catch (Exception e) {
    
    
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

Extremo de recepción

public class TalkReceive implements Runnable {
    
    
    DatagramSocket socket = null;
    private int port;
    private String msgFrom;

    public TalkReceive(int port, String msgFrom) {
    
    
        this.port = port;
        this.msgFrom = msgFrom;
        try {
    
    
            socket = new DatagramSocket(port);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
    
    
        while (true) {
    
    
            try {
    
    
                //准备接受包裹
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//阻塞式接收包裹
                //断开连接 bye
                byte[] data = packet.getData();
                String receiveData = new String(data, 0, packet.getLength());
                System.out.println(msgFrom + ":" + receiveData);
                if (receiveData.equals("bye")) {
    
    
                    break;
                }
            } catch (IOException e) {
    
    
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
}

alumno

public class TalkStudent {
    
    
    public static void main(String[] args) {
    
    
        //开启两个线程
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"老师")).start();
    }
}

maestro

public class TalkTeacher {
    
    
    public static void main(String[] args) {
    
    
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"学生")).start();
    }
}

9. URL

https://www.baidu.com/

URL: Localizador uniforme de recursos, utilizado para localizar recursos en Internet.

Resolución de nombres de dominio DNS: resuelve el nombre de dominio (www.baidu.com) en la dirección IP xxx.xxx

composición:

协议://IP地址:端口号/项目/资源名

Ejemplo:

public class URLDemo01 {
    
    
    public static void main(String[] args) throws MalformedURLException {
    
    
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=xay&password=123");
        System.out.println(url.getProtocol());//协议
        System.out.println(url.getHost());//主机ip
        System.out.println(url.getPort());//端口号
        System.out.println(url.getPath());//文件路径
        System.out.println(url.getFile());//文件全路径
        System.out.println(url.getQuery());//参数
    }
}

Descargar recursos a través de URL

public class URLDown {
    
    
    public static void main(String[] args) throws IOException {
    
    
        //1. 下载地址
        URL url = new URL("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
        //2. 连接到这个资源 HTTP
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

        InputStream is = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("/Users/xay/Desktop/编程/JAVA-FullStack/JavaSE/JavaBasics/src/com/net/demo04/test.png");
        byte[] bytes = new byte[1024];
        int len;
        while((len=is.read(bytes))!=-1){
    
    
            fos.write(bytes,0,len);//写出这个注释
        }
        fos.close();
        is.close();
        urlConnection.disconnect();//断开连接

    }
}

descargar música

public class MusicDownload {
    
    
    public static void main(String[] args) throws IOException {
    
    
        URL url = new URL("https://m701.music.126.net/20230201161620/fbc4a9b932035588e92df9f6a2f27a3f/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/14096431555/252f/b246/4da5/88c4d262ef5e22cb2a24b7c35922913b.m4a");
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        InputStream is = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("/Users/xay/Desktop/编程/JAVA-FullStack/JavaSE/JavaBasics/src/com/net/demo04/abc.m4a");
        byte[] bytes = new byte[1024];
        int len;
        while((len=is.read(bytes))!=-1){
    
    
            fos.write(bytes,0,len);
        }
        System.out.println("音乐下载完毕");
        fos.close();
        is.close();
        urlConnection.disconnect();
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42823298/article/details/128893169
Recomendado
Clasificación