JavaSE超详细笔记-网络编程篇-基于黑马

1. 什么是网络编程【理解】

1.1 概念

  • 在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
  • 应用场景:
    • 即时通信、网游对战、金融证券、国际贸易、邮件、等等。
  • 不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输
  • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序

1.2 常见的软件架构

1.21 C/S
  • C/S全称:Client/Server(客户端/服务器)
  • 采取该架构的软件,需要在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序[例如:QQ,Steam]
1.22 B/S
  • B/S全称:Browser/Server (浏览器/服务器)
  • 采取该架构的软件,只需要一个浏览器,用户通过不同的网址。客户访问不同的服务器[例如:京东,淘宝]
1.23 C/S,B/S的选择(优缺点)
  • 总结:CS适合专业化的办公软件,BS适合移动互联网应用
  • C/S
    • 优点
      • 画面可以做的非常精美,用户体验好
    • 缺点
      • 用户需要下载和更新的时候比较麻烦
      • 需要开发客户端,也需要开发服务端
  • B/S
    • 所有的通过服务器访问的其实都是bs架构,如网页游戏,购物商城 。
    • 优点[方便]
      • 不需要开发客户端,只需要页面+服务端
      • 用户不需要下载,打开浏览器就能用
    • 缺点
      • 如果应用过大,用户体验受到影响

2. 网络编程三要素【理解】

2.1 三要素简单概况

  • IP地址

    • 设备在网络中的地址,是唯一的标识
  • 端口

    • 应用程序在设备中唯一的标识
  • 协议

    • 数据在网络中传输的规则,常见的协议由UDP、TCP、http、https、ftp。

2.2 IP

复制代码
##### **2.21 概念**

* 全称:Internet Protocol,是互联网协议地址,也称IP地址。是分配给上网设备的数字标签。
* 通俗理解:上网设备在网络中的地址,是唯一的。
复制代码
##### **2.22 常见的IP分类** **​​​​​​**

* IP地址分为两大类
  * **IPv4** :全称Internet Protocol version 4,互联网通信协议第四版
    * 采用32位地址长度,分为4组
      * 例如一个采用二进制形式的IP地址是"11000000 10101000 00000001 01000010"
      * 为了方便使用,IP地址经常被写成十进制的形式,中间使用符号"."分隔不同的字节。于是,上面的IP地址可以表示为"192.168.1.66"。IP地址的这种表示法叫做"**点分十进制表示法**",这显然比1和0容易记忆得多
    * **缺点**:ip地址不够用,仅有不到43亿,于是诞生了IPv6
  * **IPv6【** 了解**】** :全称Internet Protocal version 6,互联网通信协议第六版。
    * 采用128位地址长度,分成8组
    * 这里就不举例子了,可以参考IPv4的IP地址,不过为8组,也因此有2的128次方的ip地址
    * 为了方便使用,IPv6使用**冒分十六进制表示法,**将上面每一组转为十六进制,并用冒号分隔。如2001:0DB8:0000:0023:0008:0800:200C:417A,因为比较长的原因,故把每一组前面的零进行省略,记录成2001:DB8:0:23:8:800:200C:417A
    * 特殊情况:如果计算出的16进制里面有很多连续的0,可以使用**0位压缩表示法**,如FF01:0:0:0:0:0:0:1101可以转为FF01::1101
复制代码
##### 2.23 IPv4的地址分类形式

* 主要分为公网地址(万维网使用) 和 私有地址(局域网使用)
* **私有地址**
  * 192.168.开头的就是私有地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节省IP
* **特殊IP地址**
  * 127.0.0.1,也可以是localhost:是回送地址,也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。
* **常见的CMD命令**
  * ipconfig:查看本机IP地址
  * ping:检查网络是否连通
复制代码
##### 2.24 InetAddress的使用

* **概况**:此类表示Internet协议(IP)地址
* 相关方法

  |                    方法名                    |                说明                |
  |-------------------------------------------|----------------------------------|
  | static InetAddress getByName(String host) | 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 |
  | String getHostName()                      | 获取此IP地址的主机名                      |
  | String getHostAddress()                   | 返回文本显示中的IP地址字符串                  |
java 复制代码
public class MyInetAddress {
    public static void main(String[] args) throws UnknownHostException {
        //IP的对象,看作为电脑的对象
        InetAddress address = InetAddress.getByName("LAPTOP-BPH5T8C9");
        InetAddress address1 = InetAddress.getByName("127.0.0.1");
        System.out.println(address);
        System.out.println(address1);

        String name = address.getHostAddress();
        System.out.println(name);

        String ip=address.getHostAddress();
        System.out.println(ip);


    }
}

2.3 端口号

  • 概念:应用程序在设备中唯一的标识
  • 端口号:
    • 由两个字节表示的整数,取值范围:0~65535
    • 其中0~1023之间的端口号用于一些知名的网络服务或者应用
    • 我们使用1024以上的端口号就可以了。
  • 注意:一个端口号只能被一个应用程序使用

2.4 协议

复制代码
##### 2.41 主要概念:

* 计算机网络中,连接和通信的规则被称为网络通信协议
* OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
* TCP/IP参考模型(或TCP/IP协议):事实上的国际标准
* 我们本次主要学习UDP协议和TCP协议
复制代码
##### 2.42 UDP与TCP协议的简单概括

* UDP协议
  * UDP是**面向无连接**通信协议
  * **特点**
    * 用户数据报协议
    * 速度快,有大小限制,一次最多发送64K,数据不安全,易丢失数据
  * **应用场景**
    * 网络会议
    * 语音通话
    * 在线视频
* TCP协议
  * TCP是**面向连接**的通信协议
  * **特点**
    * 速度慢
    * 没有大小限制
    * 数据安全
  * **应用场景**
    * 下载软件
    * 文字聊天
    * 发送邮件

3. UDP通信程序

3.1 UDP通信程序步骤(发送数据)
  • 发送数据的步骤(右边是将其理解为寄东西的理解)

    • 创建发送端的Socket对象(DatagramSocket) 找快递公司

    • 创建数据,并把数据打包 打包礼物

    • 调用DatagramSocket对象的方法发送数据 快递公司发送包裹

    • 关闭发送端 付钱走人

3.2 UDP发送方法
  • 构造方法

    方法名 说明
    DatagramSocket() 创建数据报套接字并将其绑定到本机地址上的任何可用端口
    DatagramPacket(byte[] buf,int len,InetAddress add,int port) 创建数据包,发送长度为len的数据包到指定主机的指定端口
  • 相关方法

    方法名 说明
    void send(DatagramPacket p) 发送数据报包
    void close() 关闭数据报套接字
    void receive(DatagramPacket p) 从此套接字接受数据报包
java 复制代码
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket ds= new DatagramSocket();
        //打包数据
        String str="数据传输中ing";
        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();
    }
  • 细节:
    • 绑定端口,我们以后就是通过这个端口往外发送
    • 空参:所有可用的端口随机一个进行使用
    • 有参:指定端口号进行绑定
3.3 UDP通信程序步骤(接收数据)
  • 接收数据的步骤(右边是将其理解为收东西的理解)
    • 创建接收端的DatagramSocket对象 找快递公司
    • 接受打包好的数据 接收箱子
    • 解析数据包 从箱子里面获取礼物
    • 释放资源 签收走人
3.4 UDP接收方法
  • 构造方法

    方法名 说明
    DatagramPacket(byte[] buf, int len) 创建一个DatagramPacket用于接收长度为len的数据包
  • 相关方法

    方法名 说明
    byte[] getData() 返回数据缓冲区
    int getLength() 返回要发送的数据的长度或接收的数据的长度
java 复制代码
    public static void main(String[] args) throws IOException {
        //细节:
        //在接收的时候,一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        //创建DatagramSocket对象
        DatagramSocket ds=new DatagramSocket(10086);

        //接收数据包
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);

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

        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");

        //释放资源
        ds.close();
    }
  • 细节:
  • 绑定端口,我们以后就是通过这个端口往外发送
  • 空参:所有可用的端口随机一个进行使用
  • 有参:指定端口号进行绑定
  • receive方法是堵塞的,会一直等发送端发送信息
3.5 UDP的三种通信方式
  • 单播:一对一个,一个电脑作为发送端,只给一台电脑发送数据
    • 上述的代码就是单播
  • 组播:一对一组,一个电脑作为发送端,可给一组电脑发送数据
    • 组播地址:224.0.0.0~239.255.255.255
      • 其中224.0.0.0~224.0.0.255 为预留的组播地址
  • 广播:一对一群,一个电脑作为发送端,可以给局域网中所有电脑发送数据
    • 广播地址:255.255.255.255
java 复制代码
// 发送端
public class ClinetDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建发送端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
        String s = "hello 组播";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.1.0");
        int port = 10000;
        // 2. 创建数据,并把数据打包(DatagramPacket)
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        // 3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
        ds.send(dp);
        // 4. 释放资源
        ds.close();
    }
}
// 接收端
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建接收端Socket对象(MulticastSocket)
        MulticastSocket ms = new MulticastSocket(10000);
        // 2. 创建一个箱子,用于接收数据
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        // 3. 把当前计算机绑定一个组播地址,表示添加到这一组中.
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        // 4. 将数据接收到箱子中
        ms.receive(dp);
        // 5. 解析数据包,并打印数据
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        // 6. 释放资源
        ms.close();
    }
}

运行效果

相关推荐
zkinglin1 分钟前
AORSA编译指南
笔记·其他·能源
手握风云-11 分钟前
JavaEE初阶第一期:计算机是如何 “思考” 的(上)
java·java-ee
普通的冒险者28 分钟前
微博项目(总体搭建)
java·开发语言
BAGAE1 小时前
Flutter 与原生技术(Objective-C/Swift,java)的关系
java·开发语言·macos·objective-c·cocoa·智慧城市·hbase
江湖有缘1 小时前
使用obsutil工具在OBS上完成基本的数据存取【玩转华为云】
android·java·华为云
bxlj_jcj1 小时前
Kafka环境搭建全攻略:从Docker到Java实战
java·docker·kafka
国科安芯1 小时前
【AS32系列MCU调试教程】性能优化:Eclipse环境下AS32芯片调试效率提升
java·性能优化·eclipse
Chase_______1 小时前
静态变量详解(static variable)
java·开发语言·jvm
厚衣服_31 小时前
第15篇:数据库中间件高可用架构设计与容灾机制实现
java·数据库·中间件
勇闯IT2 小时前
有多少小于当前数字的数字
java·数据结构·算法