【Java高级编程】网络编程

news2024/11/24 3:19:46

在这里插入图片描述

网络编程

      • 1、InetAddress类的使用
        • 1.1、实现网络通信需要解决的两个问题
        • 1.2、网络通信的两个要素
        • 1.3、通信要素一:IP和端口号
        • 1.4、通信要素二:网络通信协议
        • 1.5、TCP和UDP的区别
        • 1.6、TCP三次握手和四次挥手
      • 2、TCP网络编程
      • 3、UDP网络编程
      • 4、URL编程
        • 4.1、URL(Uniform Resource Locator)的理解
        • 4.2、URL的5个基本结构
        • 4.3、如何实例化
        • 4.4、常用方法
        • 4.5、可以读取、下载对应的url资源

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

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

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

相关文章

14-上传文件

目录 1.核心方法 1.1.HttpServletRequest 类方法 1.2.Part 类方法 2.代码示例 2.1.通过form表单方式提交文件 2.2.通过Postman来模拟上传文件 2.2.1.简易版文件上传 2.2.2.正式版,可以上传多个图片,不会覆盖 数据提交有3种方式: form…

6.28学习 babel转换,es6的装饰器

6.28学习 babel转换,es6的装饰器 1.babel转换1.1出现问题1.2babel转换 2.装饰器2.1类装饰器2.2方法装饰器 1.babel转换 1.1出现问题 先来一段代码,运行,有可能是会报错的,为什么呢?因为JS以前只能运行在浏览器中&…

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中,从最基本的绘图开始,逐步学习 Bokeh 中常用的绘图功能,目标是能满足大部分基础的绘图需求。…

密码学—Vigenere加密Python程序

文章目录 维吉尼亚加密加密算法解密算法 注意事项 维吉尼亚加密 古典密码,属于多表加密。 怎么就是多表了? 维吉尼亚密码的加密算法实质是凯撒密码,因为他是先分好小组,然后用密钥串对应着分好组的每一个字母进行加密&#xff08…

用纯CSS和DIV绘制播放按钮样式

最近在做前端的视屏监控播放对接&#xff0c;前端弄了个播放按钮&#xff0c;记录下&#xff0c;效果如图所示&#xff1a; HTML代码&#xff1a; <div className"box"><div className"one" ><div className"two"><div cl…

1.1、Java初级认识Java、jdk、 idea

前言 1.1 软件开发之 Java 开发 Java现在已经占有主流市场 企业级应用领域&#xff08;JavaEE 后台&#xff09;&#xff1a;用来开发企业级的应用程序&#xff0c;大型网站如淘宝、京 东、12306&#xff0c;以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都…

Centos7下root安装Elasticsearchhe和IK分词器

安装Elasticsearchhe和IK分词器 1. 安装前准备 安装Elasticsearch之前&#xff0c;需要安装Java8或Java8以上的Java环境&#xff0c;linux安装jdk百度一下。 2. 下载Elasticsearchhe 创建安装目录 mkdir -p /usr/local/elasticsearch如果主机联网,可以选择在线下载&#…

Matlab可调用MODTRAN5封装器之Mod5

目录 Mod5介绍安装Mod5Mod5文件位置注意事项 运行Mod5创建实例设置MODTRAN参数运行MODTRAN结果绘制示例图 Mod5介绍 MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”&#xff0c;扩展名为…

华硕ROG幻14 2023原装Windows11系统工厂模式带ASUS RECOVERY功能恢复

第一步&#xff1a;下载原装系统文件&#xff08;工厂包&#xff09; 第二步&#xff1a;华硕天选冰刃魔霸枪神灵耀等 需要自备16g空u盘安装 第三步&#xff1a;创建u盘分区&#xff0c;第一个分区格式为FAT32(存放TLK引导文件)&#xff0c;第二个分区大小为NTFS&#xff08…

利用Jetpack Compose进行导航(Navigation)

引言 Jetpack Compose是一个现代化的&#xff0c;声明式的UI工具包&#xff0c;它让我们可以更快、更简便地构建Android的界面。今天&#xff0c;我们要讨论如何使用Jetpack Compose和它的导航库&#xff08;Navigation Compose&#xff09;来进行应用导航。 初步了解Navigati…

单片机学习 15-ds1302时钟实验

DS1302 时钟实验 ​ 在前面章节&#xff0c;我们介绍了如何使用单片机 IO 口模拟 IIC 总线、单总线时序。这一章我们来学习 DS1302 时钟芯片&#xff0c;该芯片是 3 线 SPI 接口&#xff0c;所以需要使用 51单片机的 3 个 IO 口模拟 SPI 时序与 DS1302 时钟芯片通信&#xff0…

maven打包本地jar到项目中

在maven项目中&#xff0c;我们的项目依赖一般取自local的repository或者远程的repository&#xff0c;比如下面这个配置&#xff1a; maven <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> &l…

蓝桥杯专题-试题版-【矩阵乘法】【连号区间数】【闰年判断】【时间转换】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

爱普生L3515打印不出东西,打印后机器工作进纸后出来空白纸张

环境&#xff1a; 爱普生L3515彩色喷墨打印机 问题描述&#xff1a; 爱普生L3515突然打印不出东西&#xff0c;打印后机器工作进纸&#xff0c;出来空白纸张 解决方案&#xff1a; 1.检查是否没有墨水了&#xff0c;开始以为没了&#xff0c;加了满了 2.测试打印机还是打不…

【AUTOSAR】BMS开发实际项目讲解(十五)----电池管理系统架构与系统组件定义

系统架构 /System Architecture 系统结构框图 / System Structure Diagram 系统安全架构图 系统组件定义 / System Components Definition 系统组件定义表 组件需求定义/system components requirement definition系统组件需求定义表 ID 名称 ASIL 描述 SPFM LFM PMHF …

将英文版的Visual Studio 2019 切换为简体中文显示

一、需求说明 在使用Visual Studio 2019集成IDE环境下进行开发工作时;需要将IDE的环境修改为中文环境进行开发工作,中文界面对于不太熟悉Visual Studio 2019 环境的人来说是十分友好的。 二、需求分析 目前安装的Visual Studio 2019集成IDE环境是全英文的界面,需要切换为简…

hash冲突是什么?

哈希&#xff08;散列&#xff09;原理及使用 哈希&#xff08;散列&#xff09;原理及避免哈希冲突 哈希&#xff08;散列&#xff09;原理及使用哈希冲突常见哈希函数解决哈希冲突方案实现一个开散列哈希表 当我们在一堆数据中查找一个元素时&#xff0c;使用普通方法得到的时…

ChatGPT: 交互式AI助手为互联网用户带来全新体验

目录 概述&#xff1a; 优势&#xff1a; 挑战&#xff1a; 未来发展方向&#xff1a; 概述&#xff1a; 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度改变着我们的生活方式和体验方式。AI 的应用范围越来越广泛&#xff0c;从语音助手到…

Linux 内存详解,即top、free、vmstat、meminfo、Buffer和Cache的介绍

Linux 内存详解&#xff0c;即top、free、vmstat、meminfo、Buffer和Cache的介绍_用作内核缓存的内存量_zzhongcy的博客-CSDN博客 1、top linux下的任务管理器 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Win…

C#项目练习系列--1.倒计时器

C#项目练习系列--1.倒计时器 实操感想代码 实操 总体实现功能&#xff1a;选定计时时间—点击开始计时—进度条和剩余时间显示—提示时间到。 软件版本&#xff1a;VS2019 1.新建工程 选择c#&#xff0c;windows窗体应用&#xff0c;.NET Framework版本选择4或4以下时最后…