Java基础学习(17)网络编程

news2025/7/5 4:45:21

Java基础学习

  • 一、 网络编程
    • 1.1 什么是网络编程
    • 1.2 常见的软件架构:
    • 1.3 网络编程的三要素
      • 1.4 IP
      • 1.4.1 InetAddress用法
    • 1.5 端口号
    • 1.6 协议
      • 1.6.1 UDP协议
        • 1.6.1.1 UDP的三种通信方式
      • 1.6.2 TCP协议
        • 1.6.2.1 TCP底层原理

一、 网络编程

1.1 什么是网络编程

解释:

在网络通信协议下,不同计算机上运行的程序,进行的数据传输

应用场景:即时通信、网游对战、金融证券、国际贸易、邮件、等等不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输

  • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序

1.2 常见的软件架构:

  • cs —>Client/Server
    在这里插入图片描述
  • bs: Browser/Server
    在这里插入图片描述
    BS架构的优缺点:
  • 不需要开发客户端,只需要页面+服务端
  • 用户不需要下载,打开浏览器就能使用
  • 如果应用过大,用户体验受到影响
    可能会导致游戏加载不出来

CS架构的优缺点:

  • 画面可以做的非常精美,用户体验好
  • 需要开发客户端,也需要开发服务端
  • 用户需要下载和更新的时候太麻烦

CS:适合定制专业化的办公类软件如: IDEA、网游
BS:适合移动互联网应用,可以在任何地方随时访问的系统

1.3 网络编程的三要素

IP

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

端口号

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

协议

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

1.4 IP

全称:Internet Protocol,是互联网协议地址,也称IP地址是分配给上网设备的数字标签

”说人话:“
上网设备在网络中的地址,是唯一

IPv4

全称:Internet Protocolversion 4,互联网通信协议第四版。采用32位地址长度,分成4组
在这里插入图片描述

由于太少IP值,现在又出现了IPv6

IPv6

  • 全称:Internet Protocol version6 ,互联网通信协议第六版
  • 由于互联网的蓬勃发展,IP地址的需求量愈来愈大,而IPv4的模式下IP的总数是有限的,采用128位地址长度,分成8组
    在这里插入图片描述

2.IPv4有什么特点
目前的主流方案最多只有2^32次方个ip,目前已经用完了
3.IPv6有什么特点
为了解决IPv4不够用而出现的最多有2^128次方个ip可以为地球上的每一粒沙子都设定ip

lPv4的地址分类形式

  • 公网地址(万维网使用)和私有地址(局域网使用)。
  • 192.168.开头的就是私有址址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用,以此节省IP

特殊IP地址

127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机

常用的CMD命令
ipconfig: 查看本机IP地址
ping:检查网络是否连通

1.4.1 InetAddress用法

用法使用说明
static InetAddress getByName(String host)确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName()获取此IP地址的主机名
String getHostAddress()返回文本显示中的IP地址字符串
package Mysocketnet.MyInetAddressDom;

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

public class Dom1 {
    public static void main(String[] args) throws UnknownHostException {
        //获取到InetAddress对象
        InetAddress address = InetAddress.getByName("lzqxiaojiaoqi");
        System.out.println(address);

        //获取电脑名字
        String hostName = address.getHostName();
        System.out.println(hostName);//lzqxiaojiaoqi

        //获取IP地址
        String ip = address.getHostAddress();
        System.out.println(ip);//10.200.27.49
    }
}

1.5 端口号

应用程序在设备中唯一的标识。
端口号

  • 由两个字节表示的整数,取值范围:0~ 65535
  • 其中0~1023之间的端口号用于一些知名的网络服务或者应用
  • 我们自己使用1024以上的端口号就可以了

注意:一个端口号只能被一个应用程序使用

在这里插入图片描述

1.6 协议

TCP/IP 模型:
在这里插入图片描述

1.6.1 UDP协议

特点:

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议。
    速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据

由于会缺失数据,传输快,主要应用于语音通话、看视频、网络会议等等

UDP通信程序(发送数据):

  1. 找快递公司 ----> 创建发送端的DatagramSocket对象

  2. 打包礼物 ----> 数据打包(DatagramPacket)

  3. 快递公司发送包裹 ----> 发送数据

  4. 付钱走人 ----> 释放资源

package Mysocketnet.MyUDP;

import java.io.IOException;
import java.net.*;

public class SendMessageDom {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket(快递公司)
        DatagramSocket ds = new DatagramSocket();

        //打包数据(DatagramPacket)
        //首先创建需要传输的数据,变成byte[]传输
        String str = "Hello World !!";
        byte[] bytes = str.getBytes();
        int port = 10086;
        InetAddress address = InetAddress.getByName("127.0.0.1");
        //参数:1. 需要传输的数据byte[],2.截取的长度,3. id值,4. 端口
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);

        //发送数据(包裹)
        ds.send(packet);

    //清理资源
        ds.close();
    }
}

UDP通信程序(接收数据):

  1. 找快递公司 -----> 创建接收端的DatagramSocket对象
  2. 接收箱子 -----> 接收打包好的数据
  3. 从箱子里面获取礼物 -----> 解析数据包
  4. 签收走人 -----> 释放资源
package Mysocketnet.MyUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveMessageDom {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket
        //注意:要传输端口号码,而且传输的端口号码,要与传输端一致,要不然接受不到数据
        DatagramSocket ds = new DatagramSocket(10086);

        //接收数据,创建DatagramPacket空的数组对象接受传来的数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);

        //把数据拿出来
        InetAddress address = dp.getAddress();
        byte[] data = dp.getData();
        int length = dp.getLength();
        int port = dp.getPort();
        System.out.println("是"+address+"该IP通过"+port+"端口号,发过来的"+new String(data,0,length));

        //关闭窗口
        ds.close();
    }
}

dp.receive:需要等到接收到数据过后才进行下面代码的实现

练习:
在这里插入图片描述
发送:

package Mysocketnet.MyUDP.Exercise;

import javax.sound.sampled.Port;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

//创建一个聊天室
//输入是键盘输入,直到输入的是886的时候才停止。
public class Send {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket(快递公司)
        DatagramSocket ds = new DatagramSocket();

        //打包数据
        //首先通过键盘输入数据,在集训打包
        Scanner sc = new Scanner(System.in);
        InetAddress address = InetAddress.getByName("127.0.0.1");
        //端口号
        int port = 10086;
        while (true){
            //键盘录入数据,请将数据传输为byte[]类型
            System.out.println("请输入数据");
            String str = sc.nextLine();
            byte[] bytes = str.getBytes();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            //发送
            ds.send(dp);
            System.out.println("发送成功");
            if (str.equals("886")){
                System.out.println("聊天结束");
                break;
            }
        }
        //关闭
        ds.close();
    }
}

接收:

package Mysocketnet.MyUDP.Exercise;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//创建一个聊天室
//接收数据,一直接收数据,采用死循环
public class Receive {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket(接收数据的端口号)
        DatagramSocket ds = new DatagramSocket(10086);

        //一直接收数据
        //创建空包裹来接受数据
        byte[] bytes = new byte[1024];
        while (true){
            //创建DatagramPacket
            DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length);

            //接收数据
            ds.receive(dp);
            System.out.println(new String(dp.getData())+"-------"+dp.getAddress());
        }

    }
}

1.6.1.1 UDP的三种通信方式

  • 单播: 单个发送数据
    以前的代码就是单播
  • 组播: 发送一小部分数据
    组播地址: 224.0.0.0 ~ 239.255.255.255
    其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
  • 广播: 全部数据发送
    广播地址: 255.255.255.255

组播与上方代码不相同的地方是:

//创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket()

//接收的地址改为
InetAddress address = InetAddress.getByName("224.0.0.1");

1.6.2 TCP协议

  • 传输控制协议TCP(Transmission Control Protocol)
  • TCP协议是面向连接的通信协议。
    速度慢,没有大小限制,数据安全

由于传输数据相对较慢,但是传输时不会丢失数据,主要应用于:文字聊天,发送邮件

TCP通信程序

  • TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
  • 通信之前要保证连接已经建立
  • 通过Socket产生IO流来进行网络通信
    在这里插入图片描述

客户端(Socket):

  1. 创建客户端的Socket对象(Socket)与指定服务端连接
    Socket(string host, int port)
  2. 获取输出流,写数据
    Outputstream getOutputstream()
  3. 释放资源
    void close()
package Mysocketnet.MyTCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

//用TCP来创建监听窗口(发送数据)
public class client {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1", 10086);

        //创建连接通道
        OutputStream os = socket.getOutputStream();
        os.write("男孩女孩".getBytes());

        //清理资源
        os.close();
        socket.close();
    }
}

服务端:

  1. . 创建服务器端的Socket对象(ServerSocket)
    ServerSocket(int port)
  2. 监听客户端连接,返回一个Socket对象
    Socket accept()
    3 . 获取输入流,读数据,并把数据显示在控制台
    Inputstream getInputstream()
  3. 释放资源
    void close()
package Mysocketnet.MyTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//利用TCP来创建服务器端口(接收数据)
public class service {
    public static void main(String[] args) throws IOException {
    //创建Socket对象
        ServerSocket ss = new ServerSocket(10086);

        //创建接收数据
        Socket accept = ss.accept();

        //连接通道获取其传输的值
//        InputStream is = accept.getInputStream();
        //因为在这里创建的是字节流是一个字节一个字节的读取就会导致乱码
        //所有通过这里的转换流转成字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        int b;
        while ((b = br.read()) != -1){
            System.out.println((char) b);
        }

        //清理资源
        accept.close();
        ss.close();
    }
}

注意事项:

  1. 我们在利用客户端传输数据的时候必须要保证连接正常,要么就会报错
  2. 我们在创建的服务端,在读取数据的时候,可以利用转换流字节流转换为字符流,不仅提高了效率,还防止了乱码

1.6.2.1 TCP底层原理

在这里插入图片描述

三次握手:

确保链接

在这里插入图片描述

四次挥手:

确保连接断开,并且使得数据处理完全

在这里插入图片描述
个人理解:(可能不恰当,适当理解)

相当于就是先跟服务器说我要执行某个任务在服务器上,然后服务器同意后给与消息返回,但是要等到服务器手上的事情做完才能够发送同意消息,等到客户端拿到消息的时候,以为不成功,骗他的,再次向服务器确认信息后才安心的去执行任务

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

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

相关文章

C++常用的支持中文的GUI库Qt 6之一:下载、安装与使用

C常用的支持中文的GUI库Qt 6之一:下载、安装与使用 因为Qt发展变化较快,网上许多介绍Qt的下载、安装与使用已过时,初学者常因行不通而受挫,故此发布本文,以Qt 6.2.4开源版在Windows 10安装与使用为例介绍。 C好用的GU…

DM8:达梦数据库宕机版本记录汇总(持续更新中)

DM8:达梦数据库宕机版本记录汇总(持续更新中) 环境介绍1 SQL引起的数据库故障1.1 SQL引起的数据库故障汇总表1.2 gdb dmserver core 调试得到数据库崩溃时的内存信息1.3 优化参数解决故障 环境介绍 在测试环境或生产环境,特别情况下会遇到数…

go tool pprof 参数 ‘-base‘ 和 ‘-diff_base‘ 之间的区别

go tool pprof 工具是用于分析由 runtime/pprof包 或 net/http/pprof包产生的profile数据,完整的帮助文档在 https://github.com/google/pprof/blob/main/doc/README.md ,pprof 工具支持的参数很多,可以用命令 go tool pprof --help来查看全部…

DJ5-4 交换局域网(第一节课)

目录 一、局域网概述 1、LAN 的特点和分类 2、常见的网络拓扑结构 二、计算机与局域网的连接 三、局域网体系结构 四、链路层寻址地址 1、MAC 地址分配 2、MAC 地址识别 五、ARP 地址解析协议 1、ARP 地址解析协议 2、ARP:两个主机位于同一个局域网 3、…

网络计算模式复习(六)

什么是CDN CDN的全称是Content Delivery Network,即内容分发网络。 其目的通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,解决Internet网络拥挤的状况&…

socket套接字通信 TCP传输控制协议/IP网络协议 5.18

B/S :浏览器和服务器 C/S :客户机和服务器 网络的体系结构: 网络的层次结构和每层所使用协议的集合 网络采用分层管理的方法,将网络的功能划分为不同的模块 OSI模型: 共7种: 应用层:接收用户的数据,面…

Blender基础技巧小结(三)

本文续签一篇:Blender基础技巧小结(二)_皮尔斯巴巴罗的博客-CSDN博客 将物体显示为模板,类似Maya Template 四窗口视图 调整3d视图远截面 Blender并不直接支持放样,可以用第三方插件,但效果并不好 基于me…

usb摄像头驱动打印信息

usb摄像头驱动打印信息 文章目录 usb摄像头驱动打印信息 在ubuntu中接入罗技c920摄像头打印的信息如下: [ 100.873222] usb 3-2: new high-speed USB device number 5 using xhci_hcd [ 101.230728] usb 3-2: New USB device found, idVendor046d, idProduct08e5 …

SpringMVC的拦截器(Interceptor)

文章目录 1 拦截器概念2 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1:创建拦截器类步骤2:配置拦截器类步骤3:SpringMVC添加SpringMvcSupport包扫描步骤4:运行程序测试步骤5:修改拦截器拦截规则步骤6:简化SpringMvcSupport的编写 3 拦截器参数3.1 前置处理方法3.2 后置处理方…

使用frp进行内网穿透(远程连接内网服务器)

文章目录 云服务购买服务器端(即我们购买的服务器)配置客户端(即我们自己的服务器)配置使用xshell登录远程服务器在服务器端设置frp开机自启动在客户端设置frp开机自启动 这里主要介绍使用frp工具进行内网穿透,适合的场…

Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单

Spring6.0新特性 一、Spring的发展历史 二、AOT AOT是Spring6.0提供的一个新特性,Ahead of Time 提前编译。 1.AOT概述 1.1 JIT和AOT的关系 1.1.1 JIT JIT(Just-in-time) 动态编译,即时编译,也就是边运行边编译,也就是在程序运…

LangChain与大型语言模型(LLMs)应用基础教程:角色定义

如果您还没有看过我之前写的两篇博客,请先看一下,这样有助于对本文的理解: LangChain与大型语言模型(LLMs)应用基础教程:Prompt模板 LangChain与大型语言模型(LLMs)应用基础教程:信息抽取 LangChain是大型语言模型(LLM)的应用框架,LangCha…

RK3568平台开发系列讲解(LCD篇)快速了解RK LCD的使用

🚀返回专栏总目录 文章目录 一、内核Config配置二、MIPI配置2.1 引脚配置2.2 背光配置2.3 显示时序配置2.3.1 Power on/off sequence2.3.2 Display-Timings三、EDP配置3.1 引脚配置3.2 EDP背光配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇章带大家快速了…

数据结构_查找

目录 1. 查找的基本概念 2. 顺序查找和折半查找 2.1 顺序查找 2.1.1 一般线性表的顺序查找 2.1.2 有序表的顺序查找 2.2 折半查找 2.3 分块查找 2.4 相关练习 3. 树型查找 3.1 二叉排序树 3.1.1 二叉排序树的定义 3.1.2 二叉排序树的查找 3.1.3 二叉排序树…

想要一个本地部署的海洋实景三维展示系统吗?

最近几年实景三维非常火,很多人包括博主都想将自己平时干的海洋测绘项目进行实景三维化,这样做的好处就是无论是管理数据还是成果展示都非常方便。我们可能会使用谷歌地图、奥维地图、图新地球等地图服务软件,它们也提供了一些测量、画图功和…

使用Hexo在Github上搭建个人博客

使用Hexo在Github上搭建个人博客 1. 安装Node和git2. 安装Hexo3. Git与Github的准备工作4. 将Hexo部署到Github5. 开始写作 1. 安装Node和git 在Mac上安装Node.js可以使用Homebrew,使用以下命令安装: brew install node使用以下命令安装Git: …

解决 Uncaught TypeError: SpriteCanvasMaterial is not a constructor.

文章目录 前言一、替代语法总结 前言 上周买了本《Three.js开发指南》, 第三版, 里面的语法不太跟趟, 有点旧, 倒也不能全怪作者, three迭代的确很快. 一、替代语法 这几天没事做, 加上前面本来就接触过Three, 很快进展到了第六章. 在推进 利用Canvas贴图给精灵(Sprite)增加样…

研发工程师玩转Kubernetes——启用microk8s的监控面板(dashboard)

安装插件 microk8s enable dashboard 查看dashboard 地址 由于dashboard是在kube-system的namespace中,我们可以使用下面指令查看它服务的地址。 microk8s kubectl get service -n kube-system kubernetes-dashboard 可以得到地址是https://10.152.183.167。 登…

Android Jetpack-Databinding基本使用

文章目录 让你的项目支持Databinding基本使用布局和绑定表达式常用运算符判空null获取对象属性避免空指针异常其他控件引用资源引用 事件处理import,variables,and includesimportVariablesIncludes 数据更新->UI更新监听字段变化更新监听对象变化更新 UI更新->数据更新绑…

MPLS隧道——隧道迭代与MPLS高可靠性

目录 MPLS隧道迭代 什么情况下需要隧道迭代 解决方法 MPLS高可靠性 VPN FRR VPN GR MPLS隧道迭代 什么情况下需要隧道迭代 解决方法 两种解决方法 将IBGP邻居更改为Vpnv4的IBGP邻居(为目标网段产生私网标签,然后此带标签的BGP路由直接进入标签隧道…