【Java高级编程】网络编程

在这里插入图片描述

1、InetAddress类的使用

1.1、实现网络通信需要解决的两个问题

  • 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
  • 找到主机后如何可靠高效地进行数据传输

1.2、网络通信的两个要素

  • 对应问题一:IP和端口号
  • 对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)

1.3、通信要素一:IP和端口号

  • IP的理解
    • IP:唯一的标识Internet上的计算机(通信实体)
    • 在Java中使用InetAddress类代表IP
    • IP分类:IPv4和IPv6;万维网和局域网
    • 域名:www.baidu.com、www.mi.com
      • 域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。
    • 本地回路地址:127.0.0.1 对应着:localhost
  • InetAddress类:此类的一个对象就代表着一个具体的IP地址
    • 实例化:
      • getByName(String host)
      • getLocalHost()
    • 常用方法:
      • getHostName()
      • getHostAddress()
  • 端口号:正在计算机上运行的进程
    • 要求:不同的进程不同的端口号
    • 范围:被规定为一个16位的整数 0~65535
  • 端口号与IP地址的组合得出一个网络套接字:Socket

1.4、通信要素二:网络通信协议

OSI参考模型 TCP/IP参考模型 TCP/IP参考模型各层对应协议
应用层、表示层、会话层 应用层 HTTP、FTP、Telnet、DNS…
传输层 传输层 TCP、UDP…
网络层 网络层 IP、ICMP、ARP…
数据链路层、物理层 物理+数据链路层 Link

1.5、TCP和UDP的区别

  • TCP协议:
    • 使用TCP协议前,须先建立TCP连接,形成传输数据通道
    • 传输前,采用“三次握手”方式,点对点通信,是可靠的
    • TCP协议进行通信的两个应用进程:客户端、服务端
    • 在连接中可进行大数据量的传输
    • 传输完毕,需要释放已建立的连接,效率低
  • UDP协议:
    • 将数据、源、目的封装成数据包,不需要建立连接
    • 每个数据报的大小限制在64K内
    • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
    • 可以广播发送
    • 发送数据结束时无需释放资源,开销小,速度快

1.6、TCP三次握手和四次挥手

  • 三次握手
客户端 服务端 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 客户端 服务端
  • 四次挥手
主动方 被动方 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、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、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、URL编程

4.1、URL(Uniform Resource Locator)的理解

  • 统一资源定位符,对应着互联网的某一资源地址

4.2、URL的5个基本结构

  • 协议
  • 主机名
  • 端口号
  • 资源地址
  • 参数列表

4.3、如何实例化

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

4.4、常用方法

  • public String getProtocol():获取该URL的协议名
  • public String getHost():获取该URL的主机名
  • public String getPort():获取该URL的端口号
  • public String getPath():获取该URL的文件路径
  • public String getFile():获取该URL的文件名
  • public String getQuery():获取该URL的查询名

4.5、可以读取、下载对应的url资源

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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_51808107/article/details/131448537