Java基础-网络编程

文章目录

    • 1.网络相关概念
        • 1.网络通信
        • 2.网络
        • 3.IP地址
        • 4.域名和端口
          • 域名
          • 端口号
        • 5.网络协议
        • 6.TCP和UDP
          • TCP协议
          • **UDP协议**
          • TCP VS UDP
    • 2.网络编程
        • 1.InetAddress
          • 1.基本介绍
          • 2.代码实例
        • 2.Socket
          • 1.基本介绍
        • 3.Tcp字节流编程
          • 1.客户端与服务器端的信息传输
          • 案例一
          • 代码实例
          • 案例二
          • 代码实例
          • 案例三
          • 代码实例
          • 2.网络上传文件
          • 案例
          • 代码实例
          • 3.netstat指令
          • 4.Tcp网络通讯的秘密
        • 4.UDP网络通讯编程(了解)
          • 1.基本流程
          • 2.原理示意图
          • 案例
          • 代码实例
        • 5.网络编程作业
        • 作业一
          • 题目
          • 代码实例
        • 作业二
          • 题目
          • 代码实例
        • 作业三
          • 题目
          • 代码实例

1.网络相关概念

1.网络通信
  1. **概念:**两台设备之间通过网络实现数据传输
  2. **网络通信:**将数据通过网络从一台设备传输到另一台设备
  3. java.net包下面提供了一系列的接口

image-20240110193511793

2.网络
  1. 概念:两台或多台设备通过一定物理设备连接起来构成了网络
  2. 根据网络的覆盖范围可以分为
    1. 局域网
    2. 城域网
    3. 广域网
3.IP地址
  1. 概念:用于唯一标识网络中的每台计算机/主机image-20240110200500662
  2. **查看ip地址:**ipconfigimage-20240110194513921
  3. **ip地址的表示形式:**点分十进制 xx.xx.xx.xx
  4. **每一个十进制数的范围:**0到255
  5. **ip地址的组成:**网络地址+主机地址
  6. 一个字节Byte等于8个bit
  7. ipv6是16个字节
  8. ip地址分类image-20240110200540743
4.域名和端口
域名
  1. www.baidu.com
  2. 好处:方便记忆
  3. 概念:将ip地址映射为域名,使用http协议
端口号
  1. 概念:用于标识计算机上某个特定的网络程序
  2. 表示形式:以整数形式0到65535
  3. 0到1024已经被占用,比如ssh 22, ftp 21, smtp 25, http 80
  4. 常见的网络程序端口号
    1. tomcat:8080
    2. mysql:3306
    3. oracle:1521
    4. sqlsever:1433
  5. 如果一个ip地址有多个应用,可以将其部署在不同的端口上,以ip+端口号的形式访问
5.网络协议
  1. 概念:在网络编程中,数据的组织形式就是协议image-20240110204112746
  2. 网络通信协议模型image-20240110204156846
6.TCP和UDP
TCP协议

image-20240110205203795

UDP协议

image-20240110205239383

TCP VS UDP

image-20240110205319659

2.网络编程

1.InetAddress
1.基本介绍

InetAddress对象实际上就是主机名/域名 + ip地址

image-20240111091617742

2.代码实例
package Internet_;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class InetAddress_ {
    public static void main(String[] args) throws UnknownHostException {

        //获取InetAddress对象的三种方式
        //1.获取主机的
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
        //2.根据主机名获取
        InetAddress byName = InetAddress.getByName("LAPTOP-JA1NFVEM");
        System.out.println(byName);
        //3.根据域名获取
        InetAddress byName1 = InetAddress.getByName("www.sunxiansheng.cn");
        System.out.println(byName1);

        //根据InetAddress对象获取主机名/域名 + ip
        System.out.println(byName1.getHostName() + byName1.getHostAddress());
    }
}

image-20240111092533552

2.Socket
1.基本介绍
  1. 基于客户端–服务器端的网络通信
  2. 底层使用的是Tcp/Ip协议
  3. 应用场景举例:客户端发送数据,服务端接受并显示控制台
  4. 基于socket的Tcp编程:

image-20240111092951432

image-20240111093310856

3.Tcp字节流编程

image-20240111093958238

1.客户端与服务器端的信息传输
案例一

image-20240111101141745

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_1_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机的9999端口,并获取socket
            Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
            //使用IO字节流来传入数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("你好世界".getBytes());
    
            //关闭IO流和socket
            outputStream.close();
            socket.close();
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_1_server {
        public static void main(String[] args) throws IOException {
            //创建一个本机端口9999监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果客户端链接成功,则返回服务器端的socket
            Socket socket = serverSocket.accept();
            //使用IO流来获取数据
            InputStream inputStream = socket.getInputStream();
            //设置缓冲区
            byte[] bytes = new byte[100];
            //设置读取的长度
            int len = 0;
            //开始读取
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len)); //输出数据
            }
            
            //关闭
            inputStream.close();
            socket.close();
            serverSocket.close();
    
        }
    }
    
    
案例二

image-20240111101212863

image-20240111104000103

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_2_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机9999端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //使用IO流发送数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("hello,server".getBytes());
            //结束标记
            socket.shutdownOutput();
    
            //读取服务器端发送的信息
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[100];
            int len = 0;
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }
    
            //关闭
            inputStream.close();
            outputStream.close();
            socket.close();
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_2_server {
        public static void main(String[] args) throws IOException {
            //创建端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功,返回socket
            Socket socket = serverSocket.accept();
            //接受信息并输出,然后回发信息
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[100];
            int len = 0;
            int flag = 0; //记录是否读取到
            while ((len = inputStream.read(bytes)) != -1) {
                if (len > 0) {
                    flag ++;
                }
                System.out.println(new String(bytes, 0, len));
            }
            //结束标记
            socket.shutdownInput();
    
            OutputStream outputStream = null;
            if (flag > 0) { //读取到了
                //向客户端发送信息
                outputStream = socket.getOutputStream();
                outputStream.write("hello,cilent".getBytes());
            }
    
            //关闭
            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
        }
    }
    
    
  3. 注意:结束标记在Tcp字节流编程中并不是必须的!!!

案例三

image-20240111104615113

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_3_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机9999端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //使用IO流发送数据
            OutputStream outputStream = socket.getOutputStream();
            //使用转换流转成Writer
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("你好,服务器端");
            //1.字符流需要使用这个作为结束标志
            bufferedWriter.newLine();
            //2.使用字符流需要刷新
            bufferedWriter.flush();
    
            //接受服务器端信息
            InputStream inputStream = socket.getInputStream();
            //转换为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            System.out.println(bufferedReader.readLine());
    
            //关闭
            bufferedReader.close();
            bufferedWriter.close();
            socket.close();
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_3_server {
        public static void main(String[] args) throws IOException {
            //创建端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功返回socket
            Socket socket = serverSocket.accept();
            //接受消息
            InputStream inputStream = socket.getInputStream();
            //转换为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            System.out.println(bufferedReader.readLine());
    
            BufferedWriter bufferedWriter = null;
    
            OutputStream outputStream = socket.getOutputStream();
            //转换为字符流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("你好,客户端");
            //1.字符流使用这个作为结束标志
            bufferedWriter.newLine();
            //2.字符流需要刷新数据
            bufferedWriter.flush();
    
            //关闭
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            serverSocket.close();
        }
    }
    
    
2.网络上传文件
案例

image-20240111141353273

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_4_cilent {
        public static void main(String[] args) throws IOException {
            //链接本机8888端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    
            //字节流发送图片到服务器端
            OutputStream outputStream = socket.getOutputStream();
            //读取本地图片
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("e:\\1.png"));
            //设置缓冲
            byte[] bytes = new byte[1024];
            //设置读取长度
            int len = 0;
            while ((len = bufferedInputStream.read(bytes)) != -1) {
                //发送到服务器
                outputStream.write(bytes, 0, len);
            }
            //设置结束标志
            socket.shutdownOutput();
    
            //接收到服务器端发送的收到图片再退出
            InputStream inputStream = socket.getInputStream();
            //设置缓冲
            byte[] bytes1 = new byte[100];
            //记录长度
            int len1 = 0;
            while ((len1 = inputStream.read(bytes1)) != -1) {
                System.out.println(new String(bytes1, 0, len1));
            }
    
    
            //关闭
            bufferedInputStream.close();
            outputStream.close();
            socket.close();
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Tcp_4_server {
        public static void main(String[] args) throws IOException {
            //监听8888端口
            ServerSocket serverSocket = new ServerSocket(8888);
            //如果链接成功则返回socket
            Socket socket = serverSocket.accept();
    
            //接收客户端字节流数据
            InputStream inputStream = socket.getInputStream();
            //设置缓冲区
            byte[] bytes = new byte[1024];
            //设置长度
            int len = 0;
            //创建字节流
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\image\\1.png"));
            while ((len = inputStream.read(bytes)) != -1) {
                //存储在本地的src/1.png下
                //写入内容
                bufferedOutputStream.write(bytes, 0, len);
            }
    
            //向客户端发送,收到图片
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("收到图片".getBytes());
            //结束标志
            socket.shutdownOutput();
    
            //关闭
            outputStream.close();
            bufferedOutputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    
        }
    }
    
    
3.netstat指令
  1. netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况
  2. netstat -an | more可以分页显示,按空格是下一页
  3. netstat -anb可以查看哪个应用在监听
  4. listening表示某个端口在监听
  5. 本机地址是本机的ip地址+端口号
  6. 外部地址是连接到本机的ip地址+端口号
  7. 可以输出ctrl + c退出指令

4.Tcp网络通讯的秘密
  1. 当客户端连接到服务器的时候,实际上客户端也是通过一个端口和服务器进行通讯的,这个端口的Tcp/Ip来分配的,是随机的
  2. 示意图image-20240111152556257
4.UDP网络通讯编程(了解)
1.基本流程
  1. 核心的两个类,DatagramSocket与DatagramPacket
  2. 建立发送端,接收端(没有服务端和客户端的概念)
  3. 发送数据前,建立数据包 DatagramPacket对象
  4. 调用DatagramSocket的发送,接受方法
  5. 关闭DatagramSocket

image-20240111155018055

2.原理示意图

image-20240111155051836

案例

image-20240111164728980

代码实例
  1. 发送方

    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Udp_1_send {
        public static void main(String[] args) throws IOException {
            //获取一个socket并指定接受信息的端口
            DatagramSocket datagramSocket = new DatagramSocket(9998);
    
            //装包,并指定发送的主机号和端口号
            byte[] bytes = "明天吃火锅吗".getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 9999);
    
            //发送包
            datagramSocket.send(datagramPacket);
    
            //接受信息
            //创建一个包
            byte[] bytes1 = new byte[1024]; //创建字节数组接收
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
    
            //接受包
            datagramSocket.receive(datagramPacket1);
            //输出包的内容
            System.out.println(new String(bytes1, 0, datagramPacket1.getLength()));
    
            //关闭
            datagramSocket.close();
        }
    }
    
    
  2. 接收方

    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Udp_1_receive {
        public static void main(String[] args) throws IOException {
            //创建一个DatagramSocket
            DatagramSocket datagramSocket = new DatagramSocket(9999); //指定接受消息的端口号
            //创建一个DatagramPacket,用来存储信息
            byte[] bytes = new byte[1024]; //用来接受信息
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
    
            //调用receive方法接受
            datagramSocket.receive(datagramPacket);
            //输出信息
            System.out.println(new String(bytes, 0, datagramPacket.getLength()));
    
            //发送信息给另一方
            //装包
            byte[] bytes1 = "明天吃火锅!!".getBytes();
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, 0, bytes1.length, InetAddress.getLocalHost(), 9998);
    
            //发送
            datagramSocket.send(datagramPacket1);
    
            //关闭
            datagramSocket.close();
    
        }
    }
    
    
5.网络编程作业
作业一
题目

image-20240111164929293

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_1_cilent {
        public static void main(String[] args) throws IOException {
            //创建一个socket,指定要连接的ip加端口
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //获取输出流,发送信息
            OutputStream outputStream = socket.getOutputStream();
            //转换成字符流
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            //发送信息
    //        bufferedWriter.write("name");
    //        bufferedWriter.newLine();
    //        bufferedWriter.flush();
            bufferedWriter.write("hobby");
            bufferedWriter.newLine();
            bufferedWriter.flush();
    //        bufferedWriter.write("dsfsdfsf");
    //        bufferedWriter.newLine();
    //        bufferedWriter.flush();
    
            //获取输入流,读取信息
            InputStream inputStream = socket.getInputStream();
            //转化为字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取信息
            String s = bufferedReader.readLine();
            //输出信息
            System.out.println(s);
    
            //关闭
            bufferedWriter.close();
            socket.close();
    
    
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_1_server {
        public static void main(String[] args) throws IOException {
            //开端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功则返回socket
            Socket socket = serverSocket.accept();
    
            //获取输入流接受信息
            InputStream inputStream = socket.getInputStream();
            //转换成字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //读取
            String s = bufferedReader.readLine();
            String res = "";
            //根据读取的信息写返回值
            switch (s) {
                case "name":
                    res = "我是孙显圣";
                    break;
                case "hobby":
                    res = "编写java程序";
                    break;
                default:
                    res = "你说啥呢";
            }
            //获取输出流
            OutputStream outputStream = socket.getOutputStream();
            //转换为字符流
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            //返回
            bufferedWriter.write(res);
            bufferedWriter.newLine();
            bufferedWriter.flush();
    
            //关闭
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            serverSocket.close();
    
        }
    }
    
    
作业二
题目

image-20240111183211824

代码实例
  1. 发送端

    package Internet_;
    
    import java.io.IOException;
    import java.net.*;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_2_sender {
        public static void main(String[] args) throws IOException {
            //创建一个datagramsocket
            DatagramSocket datagramSocket = new DatagramSocket(8889);
            //创建一个数据包,并且进行装包
            byte[] bytes = "四大名著是哪些?".getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(
                    bytes, 0, bytes.length, InetAddress.getLocalHost(), 8888);
            //发送数据
            datagramSocket.send(datagramPacket);
            //创建一个空包,接受数据包
            byte[] bytes1 = new byte[1024];
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes1.length);
            datagramSocket.receive(datagramPacket1);
            //读取数据
            System.out.println(new String(bytes1, 0, datagramPacket1.getLength()));
            //关闭
            datagramSocket.close();
        }
    }
    
    
  2. 接收端

    package Internet_;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_2_receive {
        public static void main(String[] args) throws IOException {
            //创建socket
            DatagramSocket datagramSocket = new DatagramSocket(8888);
            //创建一个空包
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            //接受数据
            datagramSocket.receive(datagramPacket);
            //读取数据
            String s = new String(bytes, 0, datagramPacket.getLength());
            String res = new String();
            if ("四大名著是哪些?".equals(s)) {
                res = "四大名著是<红楼梦>。。。";
            }
            else {
                res = "what?";
            }
            //返回信息
            //创建一个数据包
            byte[] bytes1 = res.getBytes();
            DatagramPacket datagramPacket1 = new DatagramPacket(
                    bytes1, 0, bytes1.length, InetAddress.getLocalHost(), 8889);
            //发送
            datagramSocket.send(datagramPacket1);
    
        }
    }
    
    
作业三
题目

image-20240111192813896

代码实例
  1. 客户端

    package Internet_;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_3_client {
        public static void main(String[] args) throws IOException {
            System.out.println("请输入一个音乐文件名");
            Scanner scanner = new Scanner(System.in);
            String next = scanner.next();
            //获取一个socket,连接服务器
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            //将文件名传入服务器
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(next.getBytes());
            //结束信息
            socket.shutdownOutput();
    
            //读取服务器端的信息
            InputStream inputStream = socket.getInputStream();
            //缓冲区
            byte[] bytes = new byte[1024];
            //长度
            int len = 0;
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("src\\image\\gsls.mp3"));
    
            while ((len = inputStream.read(bytes)) != -1) {
                //将其保存到本地
                bufferedOutputStream.write(bytes, 0, len);
            }
            //关闭
            bufferedOutputStream.close();
            inputStream.close();
            outputStream.close();
            socket.close();
        }
    }
    
    
  2. 服务器端

    package Internet_;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Homework_3_server {
        public static void main(String[] args) throws IOException {
            //开启服务器端口监听
            ServerSocket serverSocket = new ServerSocket(9999);
            //如果链接成功则返回一个socket对象
            Socket socket = serverSocket.accept();
            //接受信息
            InputStream inputStream = socket.getInputStream();
            //设置缓冲
            byte[] bytes = new byte[1024];
            //读取信息
            int len = inputStream.read(bytes);
            BufferedInputStream bufferedInputStream = null;
            OutputStream outputStream = null;
            //判断
            if (new String(bytes, 0, len).equals("高山流水")) {
                //判断文件是否存在,如果存在则发送到客户端
                File file = new File("e:\\高山流水.mp3");
                if (file.exists()) {
                    //读取文件内容
                    bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
                    //缓冲区
                    byte[] bytes1 = new byte[1024];
                    //读取长度
                    int lens = 0;
                    while ((lens = bufferedInputStream.read(bytes1)) != -1) { //只要没有到文件末尾就继续读
                        //将读取到的数组发送给客户端
                        //获取输出流
                        outputStream = socket.getOutputStream();
                        outputStream.write(bytes1, 0, lens);
                    }
                    //结束语句
                    socket.shutdownOutput();
                }
            }
    
            //关闭
            bufferedInputStream.close();
            outputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    
    
        }
    }
    
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/490362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端面试3+1】02插槽、箭头函数与普通函数、重绘重排、【回文数】

一、对插槽的理解 1.定义及作用&#xff1a; 插槽是一种用于在组件中插入内容的特殊语法。它的作用是让父组件可以向子组件传递内容&#xff0c;从而实现组件的灵活性和复用性。 2.分类&#xff1a; 插槽可以分为具名插槽和作用域插槽。 2.1具名插槽&#xff1a; 具名插槽允许父…

RuoYi-Vue-Plus(sa-token)

一、介绍 官网&#xff1a; Sa-Tokenhttps://sa-token.cc/index.html 特性&#xff1a; 登录与权限认证&#xff1a;支持用户登录和细粒度权限认证。会话管理&#xff1a;提供会话创建、维护和销毁功能。单点登录&#xff1a;支持单点登录&#xff0c;简化多应用登录流程。OAu…

基于el-table实现行内增删改

实现效果&#xff1a; 核心代码&#xff1a; <el-table :data"items"style"width: 100%;margin-top: 16px"border:key"randomKey"><el-table-column label"计划名称"property"name"><template slot-scope&q…

雪里温柔,水边明秀,不及Java 抽象类 和 Object类

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Linux环境基础开发工具使用——yum and vim

本篇将会介绍平时在Linux中开发常用到的一些工具&#xff0c;其中包括&#xff1a;软件包管理器 — yum&#xff0c;Liunx中的开发工具。具体的介绍了 yum 的相关操作以及 yum 源&#xff0c;同时还介绍了 windows与虚拟机如何进行的关联。然后对Liunx中的开发工具进行了详细的…

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口&#xff0c;不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合&#xff0c;也有相应的许多方法。类…

超详细SpringMVC源码剖析

整体流程图 1.自定义视图(63~66) 视图解析过程 1.先到DispatcherServlet中央控制器, 根据视图解析的 优先级 执行对应的 视图解析器 Nullable protected View resolveViewName(String viewName, Nullable Map<String, Object> model,Locale locale, HttpServletReque…

【C语言】【Leetcode】70. 爬楼梯

文章目录 题目思路&#xff1a;简单递归 > 动态规划 题目 链接: link 思路&#xff1a;简单递归 > 动态规划 这题类似于斐波那契数列的算法&#xff0c;结果其实就是到达前一步和到达前两步的方法之和&#xff0c;一直递归到n1和n2时就行了&#xff0c;但是这种算法有个…

Fiddler抓包工具之fiddler的常用快捷键

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF&#xff1a;查找 F12&#xff1a;启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键&#xff1a;ctrl q &#xff0c;然后 输入 help…

linux C:变量、运算符

linux C 文章目录 变量运算符 一、变量 [存储类型] 数据类型 标识符 值 标识符&#xff1a;由数字、字母、下划线组成的序列&#xff0c;不能以数字开头。 数据类型&#xff1a;基本数据类型构造类型 存储类型&#xff1a;auto static…

碳课堂|什么是碳资产?企业如何进行碳资产管理?

碳资产是绿色资产的重要类别&#xff0c;在全球气候变化日益严峻的背景下备受关注。在“双碳”目标下&#xff0c;碳资产管理是企业层面实现碳减排目标和低碳转型的关键。 一、什么是碳资产&#xff1f; 碳资产是以碳减排为基础的资产&#xff0c;是企业为了积极应对气候变化&…

idea中Git项目遇到“Filename too long”错误 与 配置Git的ssh证书

一&#xff1a;“Filename too long”问题解决办法 错误信息&#xff1a; fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with git status and retry with git restore …

java算法第32天 | 贪心算法 part02 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 本题中理解利润拆分是关键点&#xff01; 不要整块的去看&#xff0c;而是把整体利润拆为每天的利润。假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[…

[医学分割大模型系列] (3) SAM-Med3D 分割大模型详解

[医学分割大模型系列] -3- SAM-Med3D 分割大模型解析 1. 特点2. 背景3. 训练数据集3.1 数据集收集3.2 数据清洗3.3 模型微调数据集 4. 模型结构4.1 3D Image Encoder4.2 3D Prompt Encoder4.3 3D mask Decoder4.4 模型权重 5. 评估5.1 评估数据集5.2 Quantitative Evaluation5.…

李宏毅【生成式AI导论 2024】第1讲:生成式AI是什么?

什么是人工智能? 人工智慧可以说是一个目标,是一个我们想要达到的目标。它不是一个单一的技术,并没有哪一个技术叫做人工智慧,人工智慧是一个目标。 什么是生成式人工智能? 生成式人工智慧是要机器产生复杂而有结构的物件。比如说文章,文章也有一连串的文字所构成的。比…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; ​​​​​​​[蓝桥杯 2023 省 A] 颜色平衡树 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表…

死锁-写一个死锁的例子

死锁-写一个死锁的例子 什么是死锁死锁产生的条件如何避免死锁死锁预防死锁避免死锁检测死锁解除鸵鸟策略 手写一个死锁的例子 https://blog.51cto.com/u_16213642/8352155 什么是死锁 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或…

代码随想录算法训练营第三十五天|860. 柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

860. 柠檬水找零 题目 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾…

C语言例4-8:格式字符c的使用例子

代码如下&#xff1a; //格式字符c的使用例子 #include<stdio.h> int main(void) {char c A;int i 65;printf("c%c,%5c,%d\n",c,c,c);printf("i%d,%c\n",i,i);return 0; } 结果如下&#xff1a;

22.WEB渗透测试-BurpSuite(一)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;21.WEB渗透测试-HTTP协议&#xff08;下&#xff09;-CSDN博客 工具的使用需要先搭建靶场…