十九、网络编程

news2024/11/14 2:32:51

目录

  • 一、什么是网络编程
  • 二、网络编程三要素
    • 2.1 IP
    • 2.2 InetAddress的使用
    • 2.3 端口号
    • 2.4 协议
  • 三、UDP通信程序
    • 3.1 发送数据
    • 3.2 接收数据
    • 3.3 练习
  • 四、UDP的三种通信方式
  • 五、TCP的通信程序
  • 六、三次握手和四次挥手
  • 七、练习
    • 7.1 TCP通信练习1——多发多收
    • 7.2 TCP通信练习2——接收和反馈
    • 7.3 TCP通信练习3——上传文件
    • 7.4 TCP通信练习4——上传文件(文件名重复问题)
    • 7.5 TCP通信练习5——上传文件(多线程版)
    • 7.6 TCP通信练习6——上传文件(线程池优化)
    • 7.7 TCP通信练习7——BS(接收浏览器的消息并打印)


一、什么是网络编程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、网络编程三要素

在这里插入图片描述
在这里插入图片描述

2.1 IP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 InetAddress的使用

public static void main(String[] args) throws UnknownHostException {
        /*
        static InetAddress getByName(String host)  确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
        String getHostName()                        获取此IP地址的主机名
        String getHostAddress()                     返回文本显示中的IP地址字符串
        */

        //0.获取InetAddress对象
        InetAddress address = InetAddress.getByName("摆烂小T");
        System.out.println(address);

        String hostName = address.getHostName();
        System.out.println(hostName);

        String hostAddress = address.getHostAddress();
        System.out.println(hostAddress);
    }

2.3 端口号

在这里插入图片描述
在这里插入图片描述

2.4 协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、UDP通信程序

3.1 发送数据

在这里插入图片描述

public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();

        //1.打包数据
        String str = "你好啊!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        //2.发送数据
        ds.send(dp);

        //3.释放资源
        ds.close();
    }

3.2 接收数据

在这里插入图片描述

public static void main(String[] args) throws IOException {
        //0.创建对象
        //细节:
        //在接收的时候,一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        DatagramSocket ds = new DatagramSocket(10086);

        //1.接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        //该方法是阻塞的
        //程序执行到这一步的时候,会在这里死等
        //等发送端发送消息
        ds.receive(dp);

        //2.解析数据
        byte[] data = dp.getData();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();
        int length = dp.getLength();

        System.out.println("发送的数据是:" + new String(data, 0, length));
        System.out.println("这条数据是从" + address + "的" + port + "端口发送出来的");

        //3.释放资源
        ds.close();
    }

3.3 练习

在这里插入图片描述
接收端:

public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10086);

        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        while (true) {
            ds.receive(dp);

            byte[] data = dp.getData();
            String hostAddress = dp.getAddress().getHostAddress();
            String hostName = dp.getAddress().getHostName();
            int length = dp.getLength();

            System.out.println("ip为:" + hostAddress + ",主机名为:" + hostName + "发送的数据是:" + new String(data, 0, length));
        }
    }

发送端

public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您要说的话:");
        while (true) {
            String str = sc.nextLine();
            if(str.equals("886")){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            ds.send(dp);
        }

        ds.close();
    }

在这里插入图片描述
在这里插入图片描述

四、UDP的三种通信方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) throws IOException {
        //组播发送代码

        MulticastSocket ms = new MulticastSocket();

        String s = "你好你好";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.2");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        //发送数据
        ms.send(dp);

        //释放资源
        ms.close();
    }
public static void main(String[] args) throws IOException {
        MulticastSocket ms = new MulticastSocket(10086);

        //将当前本机,添加到224.0.0.2的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.2");
        ms.joinGroup(address);

        //创建数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        //接收数据
        ms.receive(dp);

        //解析数据
        String hostAddress = dp.getAddress().getHostAddress();
        String hostName = dp.getAddress().getHostName();
        byte[] data = dp.getData();
        int length = dp.getLength();
        int port = dp.getPort();

        System.out.println("ip为:" + hostAddress + ",主机名为:" + hostName + "的人,发送了数据:" + new String(data, 0, length));

        ms.close();
    }

public static void main(String[] args) throws IOException {
        //广播发送代码

        MulticastSocket ms = new MulticastSocket();

        String s = "你好你好";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        //发送数据
        ms.send(dp);

        //释放资源
        ms.close();
    }

五、TCP的通信程序

在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) throws IOException {
        //TCP协议 接收数据
        //0.创建对象
        ServerSocket ss = new ServerSocket(10086);

        //1.监听客户端
        Socket accept = ss.accept();

        //2.从连接通道中获取输入流读取数据
        InputStream is = accept.getInputStream();
        int b;
        while ((b = is.read()) != -1) {
            System.out.println((char) b);
        }
        is.close();
        accept.close();
        ss.close();

    }

public static void main(String[] args) throws IOException {
        //TCP协议发送数据

        //1.创建Socket对象
        //细节:在创建对象时会连接服务端, 如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1",10086);

        //从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        os.write("aaa".getBytes());

        os.close();
        socket.close();

    }

在这里插入图片描述
在这里插入图片描述

六、三次握手和四次挥手

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、练习

7.1 TCP通信练习1——多发多收

客户端:多次发送数据
服务器:接收多次数据,并打印
public static void main(String[] args) throws IOException {
        /*客户端:多次发送数据
	      服务器:接收多次数据,并打印*/

        //0.创建Socket对象
        Socket socket = new Socket("127.0.0.1", 10086);

        //写出数据
        Scanner sc = new Scanner(System.in);
        OutputStream os = socket.getOutputStream();

        while (true) {
            System.out.println("请输入您要发送的消息:");
            String str = sc.nextLine();
            if (str.equals("886")){
                break;
            }
            os.write(str.getBytes());
        }

        //释放资源
        socket.close();

    }
public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        //等待客户端连接
        Socket accept = ss.accept();

        //读取数据
        InputStreamReader isr = new InputStreamReader(accept.getInputStream());
        int b;
        while ((b = isr.read()) != -1){
            System.out.print((char) b);
        }

        //释放资源
        ss.close();

    }

7.2 TCP通信练习2——接收和反馈

客户端:发送一条数据,接收服务端反馈的消息并打印
服务器:接收数据并打印,再给客户端反馈消息
public class Client {
    public static void main(String[] args) throws IOException {
        /*客户端:发送一条数据,接收服务端反馈的消息并打印
	        服务器:接收数据并打印,再给客户端反馈消息*/
        //0.创建一个Socket对象
        Socket s = new Socket("127.0.0.1", 10086);

        //1.写出数据
        String str = "见到你很高兴!";
        OutputStream os = s.getOutputStream();
        os.write(str.getBytes());

        //结束标记
        s.shutdownOutput();

        //3.接收服务器回写的数据
        InputStream is = s.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        int b;
        while ((b = isr.read()) != -1) {
            System.out.println((char) b);
        }

        //释放资源
        s.close();
    }
}
public class Server {
    public static void main(String[] args) throws IOException {
        //0.创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        //1.等待客户端连接
        Socket accept = ss.accept();

        //2.获取数据
        InputStream is = accept.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        int b;
        while ((b = isr.read()) != -1){
            System.out.println((char) b);
        }

        //3.会写数据
        String str = "到底有多开心呢?";
        OutputStream os = accept.getOutputStream();
        os.write(str.getBytes());

        //释放资源
        accept.close();
        ss.close();
    }
}

7.3 TCP通信练习3——上传文件

客户端:将本地文件上传到服务器。接收服务器的反馈。
服务器:接收客户端上传的文件,上传完毕之后给出反馈。

在这里插入图片描述

public class Server {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        //等待客户端连接
        Socket socket = ss.accept();

        //读取数据并保存到本地文件中
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\a.jpg"));
        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }

        bos.close();
        //会写数据
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        socket.close();
        ss.close();
    }
}
public class Client {
    public static void main(String[] args) throws IOException {
        //0.创建Socket对象
        Socket s = new Socket("127.0.0.1", 10086);

        //1.创建BufferedWriter关联本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day32_code\\ClientDir\\a.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());

        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }

        s.shutdownOutput();

        //接收服务器的回写数据
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line = br.readLine();
        System.out.println(line);

        //释放资源
        s.close();

    }
}

7.4 TCP通信练习4——上传文件(文件名重复问题)

解决上一题文件名重复问题

在这里插入图片描述

public class UUIDTest {
    public static void main(String[] args) {
        String s = UUID.randomUUID().toString().replace("-", "");
        System.out.println(s);
    }
}
String filename = UUID.randomUUID().toString().replace("-", "");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\" + filename + "+.jpg"));

7.5 TCP通信练习5——上传文件(多线程版)

想要服务器不停止,能接收很多用户上传的图片。
该怎么做呢?
提示:可以用循环或者多线程。
但是循环不合理,最优解发是用循环+多线程改写
public class MyRunable implements Runnable {
    Socket socket;

    public MyRunable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            String filename = UUID.randomUUID().toString().replace("-", "");
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day32_code\\ServerDir\\" + filename + "+.jpg"));
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }

            bos.close();
            //会写数据
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class Server {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        while (true) {
            //等待客户端连接
            Socket socket = ss.accept();

            //读取数据并保存到本地文件中
            //开启一条线程
            //一个用户对应服务端的一条线程
            new Thread(new MyRunable(socket)).start();
        }
    }
}


7.6 TCP通信练习6——上传文件(线程池优化)

频繁创建线程并销毁非常浪费系统资源,所以需要用线程池优化
public class Server {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        //创建线程池对象
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3, // 核心线程数量
                16, // 线程池总大小
                60, // 空闲时间
                TimeUnit.SECONDS, // 空闲时间(单位)
                new ArrayBlockingQueue<>(2) , // 队列
                Executors.defaultThreadFactory(), // 线程工厂
                new ThreadPoolExecutor.AbortPolicy() // 阻塞队列

        );

        while (true) {
            //等待客户端连接
            Socket socket = ss.accept();

            //读取数据并保存到本地文件中
            //开启一条线程
            //一个用户对应服务端的一条线程
            new Thread(new MyRunable(socket)).start();
        }
    }
}

7.7 TCP通信练习7——BS(接收浏览器的消息并打印)

客户端:不需要写
服务器:接收数据并打印。
public class Server {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10086);

        //等待客户端连接
        Socket accept = ss.accept();

        //读取数据
        InputStreamReader isr = new InputStreamReader(accept.getInputStream());
        int b;
        while ((b = isr.read()) != -1){
            System.out.print((char) b);
        }

        //释放资源
        ss.close();
    }
}

运行以上代码,打开浏览器,输入回环地址127.0.0.1加端口号
在这里插入图片描述
如图,idea控制台就会出现相应的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李宏毅深度强化学习导论——基本概念

引言 这是李宏毅老师深度强化学习视频的学习笔记&#xff0c;主要介绍强化学习的基本概念&#xff0c;从直观的角度去教大家如何理解强化学习的知识而不是理论的角度&#xff0c;所以包含的数学公式不多。 什么是强化学习 我们知道监督学习需要人类给机器一个标签&#xff0c…

【网络原理】详解HTTPS协议加密过程

文章目录 &#x1f334;HTTPS协议是什么&#xff1f;&#x1f384;运营商劫持事件&#x1f332;HTTPS的工作过程&#x1f338;对称加密&#x1f338;非对称加密&#x1f338;引入证书&#x1f338;完整流程 &#x1f333;HTTPS加密总结⭕总结 &#x1f334;HTTPS协议是什么&…

每日一题 --- 27. 移除元素 - 力扣 [Go]

移除元素 题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

C++进阶02 多态性

听课笔记简单整理&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;听课的记录代码~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;梅头脑&#x1f338; 审核&#xff1a;文心一言 目录 &#x1f433;课程来源 &#x1f433;前言 &#x1f40b;运…

1.3 Python是什么

Python是什么&#xff0c;Python简介 Python 是荷兰人 Guido van Rossum &#xff08;吉多范罗苏姆&#xff0c;中国程序员称其为“龟叔”&#xff09;在 1990 年初开发的一种解释型编程语言。 图1&#xff1a;Python 的标志&#xff08;Logo&#xff09; Python 的诞生是极具…

CSS问题精粹1

1.关于消除<li>列表前的符号 我相信很多人在初学CSS时会遇到该问题&#xff0c;无论是创作导航&#xff0c;还是列表&#xff0c;前面都会有个黑点点或其它符号。 解决该问题其实很简单 采用list-style-type:none或list-style:none直接解决 如果你想更换前面的黑点点&a…

计算机网络2 TCP/IP协议

目录 1 前言2 传输层2.1 端口号2.2 UDP2.3 TCP 3 网络层3.1 IP 4 数据链路层4.1 以太网4.2 ARP 5 DNS6 NAT 1 前言 2 传输层 2.1 端口号 端口号又分为&#xff1a; 知名端口&#xff1a;知名程序在启动之后占用的端口号&#xff0c;0-1023。 HTTP, FTP, SSH等这些广为使用的…

LeetCode 21 / 100

目录 矩阵矩阵置零螺旋矩阵旋转图像搜索二维矩阵 II LeetCode 73. 矩阵置零 LeetCode 54. 螺旋矩阵 LeetCode 48. 旋转图像 LeetCode 240. 搜索二维矩阵 II 矩阵 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为…

Git的 .gitignore文件及标签使用

Git的 .gitignore文件及标签使用 什么是.gitignoregit check-ignore -v 文件名 查看.gitignore里面什么内容忽略了该文件 git add -f [filename] 强制添加把指定文件排除在 .gitignore 规则外的写法给命令配置别名标签创建标签git tag [name] 创建标签git tag 列出所有标签git …

ES高可用

分布式搜索引擎ES 分布式搜索引擎ES1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.3.RestAPI实现聚合 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现酒店搜索框自动补全 3.数据同步思路分析 4.集群4.1 ES集群相关概念4.2.集群脑裂问题4.3.集群分布式存储4.4.…

【文末附gpt升级4.0方案】英特尔AI PC的局限性是什么

为什么要推出英特尔AI PC&#xff1f; 英特尔AI PC的推出无疑为AIGC&#xff08;生成式人工智能&#xff09;的未来发展开启了一扇新的大门。这种新型的计算机平台&#xff0c;通过集成先进的硬件技术和优化的软件算法&#xff0c;为AIGC提供了更为强大和高效的支持&#xff0…

掌握增长转化漏斗策略的秘诀:打造高效营销之道

在不断发展的销售和营销领域&#xff0c;传统战略通常遵循一条可预测的路径&#xff0c;引导潜在客户通过漏斗&#xff0c;最终实现销售。然而&#xff0c;一种有趣的方法颠覆了这一传统模式&#xff1a;增长漏斗策略。这种创新方法重新规划了客户旅程&#xff0c;强调了培养现…

矩形总面积(第十四届蓝桥杯JavaB组省赛真题)

测试用例范围比较大&#xff0c;所以全部用long类型&#xff0c;如果用int类型只能通过60%&#xff0c;建议在内存和运行时间允许的情况下&#xff0c;比赛题都用long。 重点在于计算相交的面积&#xff0c;这里找的两个相交点是左上角&#xff08;m1,n1&#xff09;和右下角&a…

二叉搜索树(二叉排序树)(含力扣相关题及题解)

文章目录 二叉搜索树&#xff08;二叉排序树&#xff09;1、二叉搜索树概念2、二叉搜索树的操作2.1、二叉搜索树的查找2.2、二叉搜索树的插入2.2、二叉树的删除 3、二叉搜索树的实现&#xff08;含递归版本&#xff09;4、二叉搜索树的应用4.1、K模型4.2、KV模型 5、二叉搜索树…

5.MySQL创建表单和用户

1.数据库的创建 2.创建表单 3.创建用户 创建好用户之后&#xff0c;让用户只能访问一个表的权限 再创建一个数据库&#xff0c;用户名是刚刚创建的用户&#xff0c;密码是自己设置的密码&#xff0c;这样就缩小了权限。

2024.3.21

qt实现登录界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//设置纯净窗口this->setWindowFlag(Qt::FramelessWindowHint);/…

电影aac是什么意思?如何播放、转换、编辑aac?

"电影AAC"这个术语可能是指电影中的音频编码格式。AAC&#xff08;Advanced Audio Coding&#xff09;是一种常见的音频编码格式&#xff0c;通常用于压缩音频文件&#xff0c;以在保持高质量的同时减小文件大小。在电影中&#xff0c;AAC格式的音频通常用于提供高质…

深入解析Mybatis-Plus框架:简化Java持久层开发(十二)

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本章节介绍如何通过Mybatis-Plus进行实现批量新增。 &#x1f4d6; 正文 1 为何要批量插入&#xff1f; 前面章节已经介绍&#xff0c;Mapper接口只有一个…

那些场景需要额外注意线程安全问题

主要学习那些场景需要额外注意线程安全问题&#xff0c;在这里总结了四中场景。 访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候&#xff0c;典型的场景有访问共享对象的属性&#xff0c;访问static静态变量&#xff0c;访问共享的缓存&#xff0c;等等。因为…

React 系列 之 React Hooks(一) JSX本质、理解Hooks

借鉴自极客时间《React Hooks 核心原理与实战》 JSX语法的本质 可以认为JSX是一种语法糖&#xff0c;允许将html和js代码进行结合。 JSX文件会通过babel编译成js文件 下面有一段JSX代码&#xff0c;实现了一个Counter组件 import React from "react";export defau…