十九、网络编程

目录

  • 一、什么是网络编程
  • 二、网络编程三要素
    • 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控制台就会出现相应的信息。

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

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

相关文章

Cookie使用

文章目录 一、Cookie基本使用1、发送Cookie2、获取Cookie 二、Cookie原理三、Cookie使用细节 一、Cookie基本使用 1、发送Cookie package com.itheima.web.cookie;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.I…

82.删除排序链表中的重复元素II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.23-03.29 #16场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-03-23&#xff08;周六&#xff09; #7场比赛2024-03-24…

高级数据结构 <AVL树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文AVL树的性质AVL树的定义AVL树的插入函数左单旋右单旋右左双旋左右双旋 检验AVL树的合法性关于AVL树 最后 前言 前面我们学习了二叉树&#xff0c;普通的二叉树没有任何特殊性质&…

C语言易错知识点:二级指针、数组指针、函数指针

指针在C语言中非常关键&#xff0c;除开一些常见的指针用法&#xff0c;还有一些可能会比较生疏&#xff0c;但有时却也必不可少&#xff0c;本文章整理了一些易错知识点&#xff0c;希望能有所帮助&#xff01; 1.二级指针&#xff1a; parr是一个指针数组&#xff0c;其中每…

GEE遥感云大数据林业应用典型案例及GPT模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

数据结构:初识树和二叉树

目前主流的方式是左孩子右兄弟表示法 我们的文件系统就是一个树 以上就是树的概念&#xff0c;我们今天还要来学习一种从树演变的重要的结构&#xff1a;二叉树 顾名思义二叉树就是一个结点最多有两个子树。 其中我们还要了解满二叉树和完全二叉树的概念 注意我们的完全二叉…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态&#xff1a;互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程&#xff08;Concurrent programming&#xff09;&#…

网络: 传输层

功能: 将数据从发送到传给接收端 UDP 无连接状态: 知道对端的IP和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制. 出错不会管面向数据包: 不能够灵活的控制读写数据的次数和数量 发送速度快: 立即发送 报文结构 TCP 面向连接可靠 校验和序列号(按…

Java项目基于Docker打包发布

1.打包应用 mvn clean package -DskipTests 或者 2.新建dockerfile FROM openjdk:8 #设置工作目录 WORKDIR /opt#COPY wms-app-0.0.1-SNAPSHOT.jar /wms-app/app.jar ADD wms-app-0.0.1-SNAPSHOT.jar app.jar #配置容器暴露的端口 EXPOSE 8080 #查看是否已经copy进去 R…

YOLOv1学习

YOLO系列学习笔记 YOLOv1评价指标PrecisionRecallAPmAP 置信度分数统一检测框架网络结构训练损失函数 测试YOLOv1的不足实验结论 YOLOv1 优点&#xff1a; 快全图推理&#xff0c;背景错误率低泛化能力强 每个图像固定大小 448*448&#xff0c;系统将输入图像分成S S网格。…

视频素材库哪里找?推荐几个高质量的无水印视频素材网

在寻找创意优质素材的道路上&#xff0c;拥有一个好的导航仪至关重要。这不仅仅是关于找到一张图片或一个视频&#xff0c;而是关于发现那些能让你的项目闪耀的宝藏。今天&#xff0c;我将混合介绍国内外的素材网站&#xff0c;旨在为你提供一个全面的视角&#xff0c;同时尽量…

Python之Web开发中级教程----Django站点管理

Python之Web开发中级教程----Django站点管理 网站的开发分为两部分&#xff1a;内容发布和公共访问 内容发布是由网站的管理员负责查看、添加、修改、删除数据 Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地…

Python 安装目录及虚拟环境详解

Python 安装目录 原文链接&#xff1a;https://blog.csdn.net/xhyue_0209/article/details/106661191 Python 虚拟环境 python 虚拟环境图解 python 虚拟环境配置与详情 原文链接&#xff1a;https://www.cnblogs.com/hhaostudy/p/17321646.html

C++进阶02 多态性

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

LeetCode困难题----84.柱状图中的最大矩形

今天刷LeetCode时遇到了一个很有意思的题: 看了半天题解还是没理解他的代码想要表达的是什么意思,在思考了很久之后,终于,我理解了这道题,接下来让我带你们走进这道题。 这道题的大概意思是,给你一个heights[]数组,(宽为1)让你求出他们可以组合出的最大面积 首先,我们先用暴力法…

MQTTnet实现客户端连接

使用MQTTnet(Version=4.3.1.873)库实现多客户端连接多服务端,同时实现断线重连; 如下图所示,开启3个客户端连接3个服务端,当其一个服务端出现异常(服务停止,网络异常无法连接)导致连接断开时,实现每5秒连接一次 MQTT连接服务核心类:业务需求是一个客户端对应的一个MQ…

libVLC 设置视频宽高比

宽高比是指视频图像的宽度和高度之间的比率。 投影屏幕尺寸一般都按照对角线的大小来定义的。根据图像制式不同&#xff0c;屏幕的长宽比例也有几种格式&#xff1a; 传统影视的宽高比是 4&#xff1a;3&#xff0c;宽屏幕电影的宽高比是 1.85&#xff1a;1&#xff0c;高清晰…

python中获取当前项目的目录

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天介绍一下&#xff0c;如何在python中获取当前项目所在的目录&#xff0c;而不是运行脚本的目录。 class ProjectPaths:# 初始化时获取当前脚本的路径staticmethoddef get_script_dir():…

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…