[Programación avanzada Java] Programación de red

inserte la descripción de la imagen aquí

1. Uso de la clase InetAddress

1.1 Es necesario resolver dos problemas para realizar la comunicación en red

  • Cómo ubicar con precisión uno o más hosts en la red; ubicar aplicaciones específicas en un host
  • Cómo transferir datos de manera confiable y eficiente después de encontrar el host

1.2 Dos elementos de la comunicación en red

  • Pregunta correspondiente 1: IP y número de puerto
  • Pregunta correspondiente 2: Proporcionar protocolo de comunicación de red: modelo de referencia TCP/IP (capa de aplicación, capa de transporte, capa de red, capa física + enlace de datos)

1.3 Elemento de comunicación 1: IP y número de puerto

  • Comprensión de la PI
    • IP: identifica de forma única una computadora (entidad de comunicación) en Internet
    • Use la clase InetAddress para representar IP en Java
    • Clasificación IP: IPv4 e IPv6, World Wide Web y red de área local
    • Nombre del área: www.baidu.com, www.mi.com
      • Resolución de nombres de dominio: El nombre de dominio es fácil de recordar.Después de ingresar el nombre de dominio de un host al conectarse 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 una conexión pueda establecerse con el huésped.
    • Dirección de bucle local: 127.0.0.1 corresponde a: localhost
  • Clase InetAddress: un objeto de esta clase representa una dirección IP específica
    • instanciar:
      • getByName(Cadena host)
      • getLocalHost()
    • Métodos comunes:
      • getHostName()
      • getHostAddress()
  • Número de puerto: el proceso que se ejecuta en la computadora
    • Requisito: diferentes números de puerto para diferentes procesos
    • Rango: especificado como un entero de 16 bits 0~65535
  • La combinación de número de puerto y dirección IP da como resultado un socket de red: Socket

1.4 Elemento de comunicación 2: Protocolo de comunicación de red

modelo de referencia OSI Modelo de referencia TCP/IP Protocolos correspondientes a cada capa del modelo de referencia TCP/IP
capa de aplicación, capa de presentación, capa de sesión capa de aplicación HTTP, FTP, Telnet, DNS…
capa de transporte capa de transporte TCP, UDP...
Capa de red Capa de red IP, ICMP, ARP…
capa de enlace de datos, capa física Capa física + enlace de datos Enlace

1.5, la diferencia entre TCP y UDP

  • Protocolo 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, el método de "apretón de manos de tres vías", comunicación punto a punto, es confiable
    • Dos procesos de aplicación para la comunicación del protocolo TCP: cliente y servidor
    • Se puede transferir una gran cantidad de datos en la conexión.
    • Una vez que se completa la transmisión, la conexión establecida debe liberarse, lo cual es ineficiente
  • Protocolo UDP:
    • Encapsule datos, origen y destino en paquetes sin establecer una conexión
    • El tamaño de cada datagrama está limitado a 64K
    • Independientemente de si el remitente está listo o no, el receptor no confirma la recepción, por lo que no es confiable
    • Puede transmitir
    • No hay necesidad de liberar recursos al final del envío de datos, con gastos generales bajos y alta velocidad

1,6, apretón de manos TCP de tres vías y onda de cuatro vías

  • tres apretón de manos
客户端 服务端 seq=x,SYN=1 客户端发送syn报文, 并置发送序号为x ACK=x+1,seq=y,SYN=1 服务端发送syn+ACK报文 并置发送序号为y, 再确定序号为x+1 ACK=y+1,seq=z 客户端发送ACK报文, 并置发送序号为z 再确定序号为Y+1 客户端 服务端
  • saludó cuatro veces
主动方 被动方 Fin=1,Ack=z,seq=x 主动方发送Fin+Ack报文, 并置发送序号为X ACK=x+1,seq=z 被动方发送ACK报文, 并置发送序号为Z, 再确定序号为X+1 Fin=1,ack=x,seq=y 被动方发送Fin+Ack报文, 并置发送序号为Y, 再确定序号为X ACK=Y,seq=x 主动方发送ack报文, 并置发送序号为X, 再确认序号为Y 主动方 被动方

2. Programación de red TCP

/**
 * 客户端发送信息给服务端,服务端将数据显示在控制台上
 */
public class TCPTest1 {
    // 客户端
    @Test
    public void client() {
        Socket socket = null;
        OutputStream os = null;
        try {
            // 1、创建Socket对象,指明服务器端的IP和端口号
            InetAddress inet = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inet, 8899);
            // 2、获取一个输出流,用于输出数据
            os = socket.getOutputStream();
            // 3、写出数据的操作
            os.write("你好,我是客户端mm".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4、资源的关闭
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //服务端
    @Test
    public void server () {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            // 1、创建服务器端的ServerSocket,指明自己的端口号
            ss = new ServerSocket(8899);
            // 2、调用accept()表示接收来自客户端的socket
            socket = ss.accept();
            // 3、获取输入流
            is = socket.getInputStream();
            // 4、读取输入流中的数据
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[5];
            int len;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }

            System.out.println(socket.getInetAddress().getHostAddress() + ":" + baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5、关闭资源
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
/**
 * 客户端发送文件给服务端,服务端将文件保存在本地
 */
public class TCPTest2 {
    // 客户端
    @Test
    public void client () {
        Socket socket = null;
        OutputStream os = null;
        FileInputStream fis = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
            os = socket.getOutputStream();
            fis = new FileInputStream(new File("beauty.jpg"));
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //服务端
    @Test
    public void server () {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            ss = new ServerSocket(9090);
            socket = ss.accept();
            is = socket.getInputStream();
            fos = new FileOutputStream(new File("beauty1.jpg"));

            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
/**
 * 从客户端发送文件给服务器,服务端保存到本地。并返回“发送成功”给客户端
 * 并关闭相关的连接
 */
public class TCPTest3 {
    // 客户端
    @Test
    public void client ()
    {
        Socket socket = null;
        OutputStream os = null;
        FileInputStream fis = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
            os = socket.getOutputStream();
            fis = new FileInputStream(new File("beauty.jpg"));

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            // 关闭数据的输出
            socket.shutdownOutput();

            // 接收来自于服务器端的数据,并显示到控制台上
            is = socket.getInputStream();
            baos = new ByteArrayOutputStream();
            byte[] buffer1 = new byte[20];
            int len1;
            while ((len1 = is.read(buffer1)) != -1) {
                baos.write(buffer1, 0, len1);
            }

            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    // 服务端
    @Test
    public void server () {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        OutputStream os = null;
        try {
            ss = new ServerSocket(9090);
            socket = ss.accept();
            is = socket.getInputStream();
            fos = new FileOutputStream(new File("beauty2.jpg"));

            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }

            System.out.println("图片传输完成");

            // 服务器端给予客户单反馈
            os = socket.getOutputStream();
            os.write("你好,美女,照片我已收到,非常漂亮!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3. Programación de red UDP

public class UDPTest {
    // 发送端
    @Test
    public void sender () {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket();

            String str = "我是UDP方式发送的导弹";
            byte[] data = str.getBytes();
            InetAddress inet = InetAddress.getLocalHost();
            DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet, 9090);

            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                socket.close();
            }
        }
    }
    // 接收端
    @Test
    public void receiver () {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(9090);

            byte[] buffer = new byte[100];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

            socket.receive(packet);

            System.out.println(new String(packet.getData(), 0, packet.getLength()));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }
    }
}

4. Programación de URL

4.1 Comprensión de la URL (localizador uniforme de recursos)

  • Localizador uniforme de recursos, correspondiente a una dirección de recursos en Internet

4.2 Cinco estructuras básicas de URL

  • protocolo
  • nombre de la CPU
  • el número de puerto
  • dirección de recursos
  • lista de parámetros

4.3, cómo instanciar

  • URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom")

4.4 Métodos comunes

  • public String getProtocol(): Obtener el nombre de protocolo de la URL
  • public String getHost(): Obtener el nombre de host de la URL
  • public String getPort(): Obtener el número de puerto de la URL
  • public String getPath(): Obtener la ruta del archivo de la URL
  • public String getFile(): Obtener el nombre de archivo de la URL
  • public String getQuery(): Obtener el nombre de consulta de la URL

4,5, puede leer y descargar los recursos de URL correspondientes

public static void main(String[] args) {
    HttpURLConnection urlConnection = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try {
        URL url = new URL("http://localhost:8080/examples/beauty.jpg");
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.connect();

        is = urlConnection.getInputStream();
        fos = new FileOutputStream("day10\\beauty3.jpg");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }

        System.out.println("下载完成");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_51808107/article/details/131448537
Recomendado
Clasificación