Day62.IO网络编程复习 -Java常用类、集合、IO#

    科技2022-08-22  104

    网络编程复习

    InetAddress类的使用

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

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

    二、网络通信的两个要素:

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

    三、通信要素1: IP和端口号

    IP的理解

    1. IP: 唯一的标识 Internet 上的计算机(通信实体) 2. 在Java中使用InetAddress类代表IP 3. IP分类: IPv4 和 IPv6 ; 万维网 和 局域网 4. 域名: www.baidu.com www.mi.com www.sina.com www.vip.com 域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化为IP地址,这样才能和主机建立链接 5. 本地回路地址: 127.0.0.1 对应着: localhost

    InetAddress类:

    此类的一个对象就代表着一个具体的IP地址

    实例化
    getByName(String host) getLocalHost()
    常用方法
    getHostName()获取域名 getHostAddress()获取IP地址

    端口号

    正在计算机上运行的进程 要求: 不同的进程有不同的端口号 范围: 被规定为一个16位的整数 0~65535 端口号与IP地址的组合得出一个网络套接字: Socket

    四、通信要素2: 网络通信协议

    1. 分型模型

    2. TCP和UDP的区别

    TCP:可靠传输;进行大数据量传输;效率低

    UDP:不可靠传输;数据报大小限制64kb;效率高

    3. TCP的三次握手、四次挥手

    TCP网络编程

    例题1

    客户端发送信息给服务端,服务端将数据显示在控制台上 /* 实现TCP的网络编程 例题1:客户端发送信息给服务端,服务端将数据显示在控制台上 */ public class TCPTest1 { //客户端 @Test public void client() { Socket socket = null; OutputStream os = null; try { //1. 创建Socket对象,指明服务器端的IP和端口号 InetAddress inet1 = InetAddress.getByName("127.0.0.1"); socket = new Socket(inet1,8899); //2. 获取一个输出流,用于输出数据 os = socket.getOutputStream(); //3. 写出数据的操作 os.write("你好,我是客户端".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(); //不建议这样写,可能会有乱码 // byte[] buffer = new byte[20]; // int len; // while ((len = is.read(buffer)) != -1){ // String str = new String(buffer,0,len); // System.out.print(str); // } //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(baos.toString()); System.out.println("收到了来自于:"+socket.getInetAddress().getHostAddress()+"的数据"); } 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(); } } } } }

    例题2

    客户端发送文件给服务端,服务端将文件保存在本地。 /* 实现TCP的网络编程 例题2: 客户端发送文件给服务端,服务端将文件保存在本地。 */ public class TCPTest2 { //客户端 @Test public void client(){ Socket socket = null; OutputStream os = null; BufferedInputStream bis = null; try { //1. 创建一个Socket对象,指明服务器端的IP和端口号 InetAddress inet1 = InetAddress.getByName("127.0.0.1"); socket = new Socket(inet1,8899); //2. 创建输出流,用于输出数据 os = socket.getOutputStream(); //3. 创建要输入发送的文件 bis = new BufferedInputStream(new FileInputStream("滑稽.jpg")); //4. 发送操作 byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1){ os.write(buffer,0,len); } } catch (IOException e) { e.printStackTrace(); } finally { //5. 流资源的关闭 if (bis != null){ try { bis.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; BufferedOutputStream bos = null; try { //1. 创建服务器端的ServerSocket,指明自己的端口号 ss = new ServerSocket(8899); //2. 调用accept() 表示接受来自客服端的socket socket = ss.accept(); //3. 获取一个输入流 is = socket.getInputStream(); //4. 创建一个保存本地的输出流 bos = new BufferedOutputStream(new FileOutputStream("滑稽1.jpg")); //5. 保存本地的操作 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1){ bos.write(buffer,0,len); } System.out.println("接收成功"); } catch (IOException e) { e.printStackTrace(); } finally { //6. 资源的关闭 if (bos != null){ try { bos.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

    从客户端发送文件给服务端,服务端保存到本地。 并返回"发送成功"客户端。且关闭相应连接 异常采用try-catch-finally接受 /* 实现TCP的网络编程 例题3: 从客户端发送文件给服务端,服务端保存到本地。 并返回"发送成功"客户端。且关闭相应连接 异常采用try-catch-finally接受 */ public class TCPTest3 { //客户端 @Test public void client() throws IOException { //1. Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9909); //2. OutputStream os = socket.getOutputStream(); //3. BufferedInputStream bis = new BufferedInputStream(new FileInputStream("滑稽.jpg")); //4. byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1){ os.write(buffer,0,len); } //关闭数据的输出 socket.shutdownOutput(); //5. InputStream is = socket.getInputStream(); ByteArrayOutputStream 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()); //6. baos.close(); is.close(); bis.close(); os.close(); socket.close(); } //服务端 @Test public void server() throws IOException { //1. ServerSocket socket = new ServerSocket(9909); //2. Socket accept = socket.accept(); //3. InputStream is = accept.getInputStream(); //4. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("滑稽2.jpg")); //5. byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer))!= -1){ bos.write(buffer,0,len); } System.out.println("本地接受数据完成"); //6. OutputStream os = accept.getOutputStream(); os.write("文件已接受并保存".getBytes()); //7. os.close(); bos.close(); is.close(); accept.close(); socket.close(); } }

    UDP网络编程

    代码举例

    /* UDP协议的网络编程 */ public class UDPTest { //发送端 @Test public void sender() throws IOException { DatagramSocket socket = null; try { socket = new DatagramSocket(); String str = "我是UDP方式发送的导弹"; byte[] data = str.getBytes(); InetAddress inet = InetAddress.getByName("127.0.0.1"); DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090); socket.send(packet); } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null){ try { socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } //接受端 @Test public void receiver() throws IOException { 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 { if (socket != null){ try { socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } }

    URL编程

    1. URL(Uniform Resource Locator)的理解:

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

    2. URL的5个基本结构:

    https://localhost:8080/examples/beauty.jpg?username=Tom 协议:// 主机名(域名) :端口号 资源地址 参数列表

    3. 如何实例化:

    URL url = new URL("https://www.bilibili.com/video/BV1Kb411W75N?p=629");

    4. 常用方法:

    // public String getProtocol( ) 获取该URL的协议名 System.out.println(url.getProtocol());//https // public String getHost( ) 获取该URL的主机名(域名) System.out.println(url.getHost());//www.bilibili.com // public String getPort( ) 获取该URL的端口号 System.out.println(url.getPort());//-1 // public String getPath( ) 获取该URL的文件路径 System.out.println(url.getPath());///video/BV1Kb411W75N // public String getFile( ) 获取该URL的文件名 System.out.println(url.getFile());///video/BV1Kb411W75N?p=629 // public String getQuery( ) 获取该URL的查询名 System.out.println(url.getQuery());//p=629

    5. 可以读取、下载对应的url资源:

    public class URLTest1 { public static void main(String[] args){ HttpURLConnection openConnection = null; InputStream is = null; BufferedOutputStream bos = null; try { URL url = new URL("https://www.bilibili.com/video/BV1Kb411W75N?p=629"); openConnection = (HttpURLConnection) url.openConnection(); openConnection.connect(); is = openConnection.getInputStream(); bos = new BufferedOutputStream(new FileOutputStream("c.mp4")); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1){ bos.write(buffer,0,len); } System.out.println("下载完成"); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (bos != null){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (openConnection != null){ try { openConnection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } } }
    Processed: 0.037, SQL: 9