Day19-【Java SE进阶】网络编程

2024-04-13 22:04
文章标签 java 进阶 se day19 编程 网络

本文主要是介绍Day19-【Java SE进阶】网络编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、网络编程

1.概述
  • 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。
  • java.net,*包下提供了网络编程的解决方案!

基本的通信架构
基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。

在这里插入图片描述

在这里插入图片描述
网络通信的关键三要素
在这里插入图片描述
IP地址

  • IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
  • IP地址有两种形式:IPV4、IPV6

在这里插入图片描述

  • IPv6:共128位,号称可以为地球每一粒沙子编号。
  • IPV6分成8段表示,每段每四位编码成一个十六进制位表示,数之间用冒号(:)分开。

在这里插入图片描述
IP域名

  • 公网IP:是可以连接互联网的IP地址;内网IP:也叫局域网IP,只能组织机构内部使用。
  • 192.168.开头的就是常见的局域网地址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用。
    在这里插入图片描述

特殊IP地址
127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。
IP常用命令:
ipconfig:查看本机IP地址。
ping IP地址:检查网络是否连通。

1.1 InetAddress
  • 代表IP地址。
    -

端口

  • 标记正在计算机设备上运行的应用程序的,被规定为一个16 位的二进制,范围是 0~65535

分类

  • 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
  • 注册端口:1024~49151,分配给用户进程或某些应用程序。
  • 动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配。
  • 注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

通信协议

  • 网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议

开放式网络互联标准:OSI网络参考模型

  • OSI网络参考模型:全球网络互联标准。
  • TCP/IP网络模型:事实上的国际标准。
    在这里插入图片描述
1.2 重要知识点:传输层的2个通信协议
  • UDP(User Datagram Protocol):用户数据报协议;
  • TCP(Transmission ControlProtocol):传输控制协议。

UDP协议

  • 特点:无连接、不可靠通信。
  • 通讯效率高!语音通话 视频直播
  • 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
  • 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

TCP协议

  • 特点:面向连接、可靠通信。
  • 通信效率相对不高 网页 文件下载 支付
  • TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。
  • TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
  • TCP协议:三次握手建立可靠连接
    • 可靠连接:确定通信双方,收发消息都是正常无问题的!(全双工)
    • 传输数据会进行确认,以保证数据传输的可靠性在这里插入图片描述
  • TCP协议:四次握手断开连接
    • 目的:确保双方数据的收发都已经完成!

在这里插入图片描述

在这里插入图片描述

2. UDP通信-快速入门

UDP通信

  • 特点:无连接、不可靠通信。
  • 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。
  • Java提供了一个java.net.DatagramSocket类来实现UDP通信。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
import java.net.*;public class Client {public static void main(String[] args) throws Exception {//1. 创建客户端对象(发韭菜出去的人)DatagramSocket socket = new DatagramSocket();//2. 创建数据包对象封装要发出去得数据(创建一个韭菜盒子)/* public DatagramPacket(byte buf[], int length,InetAddress address,int port)参数一:封装要发出去的数据。参数二:发送出去的数据大小(字节个数)参数三:服务端的IP地址(找到服务端主机)参数四:服务端程序的端口。*/byte[] bytes = "我是客户端,向您发送数据!".getBytes();DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666);//3. 开始正式发送这个数据包出去了socket.send(packet);System.out.println("客户端数据发送完毕~~~");socket.close();//释放资源!}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server {public static void main(String[] args) throws Exception {//1. 创建一个服务端对象(创建一个接韭菜的人) 注册端口DatagramSocket socket = new DatagramSocket(6666);//2. 创建一个数据包对象,用于接收数据的(创建一个韭菜盒子)byte[] buf = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buf, buf.length);//3. 开始正式使用数据包来接收客户端发来的数据socket.receive(packet);//4. 从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少 获取本次数据包接收了多少数据int len = packet.getLength();String s = new String(buf, 0, len);System.out.println(s);String hostAddress = packet.getAddress().getHostAddress();int port = packet.getPort();System.out.println(hostAddress + ":" + port);socket.close();//释放资源}
}

在这里插入图片描述
在这里插入图片描述
UDP通信 多发多收
edit configures->allow 多开 apply即可躲开client程序的

package com.jingwei;import java.net.*;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1. 创建客户端对象(发韭菜出去的人)DatagramSocket socket = new DatagramSocket();//可以分配端口 或者不填写自动分配//2. 创建数据包对象封装要发出去得数据(创建一个韭菜盒子)/* public DatagramPacket(byte buf[], int length,InetAddress address,int port)参数一:封装要发出去的数据。参数二:发送出去的数据大小(字节个数)参数三:服务端的IP地址(找到服务端主机)参数四:服务端程序的端口。*/Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说");String msg = sc.nextLine();if("exit".equals(msg)) {System.out.println("退出成功!");socket.close();break;}byte[] bytes = msg.getBytes();DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666);//3. 开始正式发送这个数据包出去了socket.send(packet);}System.out.println("客户端数据发送完毕~~~");}
}
package com.jingwei;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server {public static void main(String[] args) throws Exception {//1. 创建一个服务端对象(创建一个接韭菜的人) 注册端口DatagramSocket socket = new DatagramSocket(6666);//2. 创建一个数据包对象,用于接收数据的(创建一个韭菜盒子)byte[] buf = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buf, buf.length);while (true) {//3. 开始正式使用数据包来接收客户端发来的数据socket.receive(packet);//4. 从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少 获取本次数据包接收了多少数据int len = packet.getLength();String s = new String(buf, 0, len);System.out.println(s);String hostAddress = packet.getAddress().getHostAddress();int port = packet.getPort();System.out.println(hostAddress + ":" + port);System.out.println("-----------------------");}}
}

这篇关于Day19-【Java SE进阶】网络编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901336

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain