当前位置: 首页 > article >正文

Java基础 Day26

一、网络编程简介

1、概念

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

2、软件架构

(1)CS架构(客户端和服务端)

在用户本地有一个客户端程序,在远程有一个服务器端程序

(2)BS架构(浏览器和服务端)

只需要浏览器,用户通过不同的网址,客户访问不同的服务器端程序

微信小程序属于BS架构

二、网络编程三要素

1、IP

(1)简介

Internet Protocol,是互联网协议地址,也称IP地址

上网设备在网络中的地址,是唯一的

是设备在网络中的唯一标识

有 IPv4 和 IPv6

域名通过 DNS 服务器解析为 IP

(2)IPv4 的地址分类形式

公网地址(万维网使用) 和私有地址(局域网使用)

192.168. 开头的就是私有地址,范围即为192.168.0.0~192.168.255.255

专门为组织机构内部使用,以此节省IP

(3)特殊 IP 地址

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

(4)常用CMD命令

ipconfig:查看本机IP地址

ping:检查网络是否连通

(5)INetAddress 类

static InetAddress getByName​(String host)

确定主机名称的IP地址

主机名称可以是机器名称,也可以是IP地址

String getHostName​()

获取此 IP 地址的主机名

String getHostAddress​()

返回文本显示中的 IP 地址字符串

2、端口

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

端口号:由两个字节表示的整数,取值范围:0~65535

其中0~1023之间的端口号用于一些知名的网络服务或者应用

我们自己使用1024及以上的端口号即可

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

3、协议

计算机网络中,连接和通信的规则被称为网络通信协议

常见的协议有UDP、TCP、http、https、ftp等

三、UDP 协议

1、特点

UDP是面向无连接通信协议(没有接收端也能发送)

速度快,有大小限制(一次最多发送64K),数据不安全,易丢失数据

2、收发数据步骤及示例

public class Send {public static void main(String[] args) throws Exception {// 1、创建DatagramSocket对象DatagramSocket socket = new DatagramSocket(8888);// 如果不指定端口,则随机指定一个// 2、创建DatagramPacket对象String message = "Hello World!";byte[] content = message.getBytes();DatagramPacket packet = new DatagramPacket(content,content.length,InetAddress.getByName("127.0.0.1"),9999);// 3、发送信息socket.send(packet);// 4、释放资源socket.close();}
}public class Receive {public static void main(String[] args) throws Exception {// 1、创建DatagramSocket对象DatagramSocket socket = new DatagramSocket(9999);// 2、创建DatagramPacket对象byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);// 3、接收数据socket.receive(packet);// 注意:receive方法会阻塞,直到接收到信息后才会往下执行// 接收到的数据在 packet中// 4、解析数据byte[] data = packet.getData();String msg = new String(data, 0, packet.getLength());String ip = packet.getAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);// 5、释放资源socket.close();}

四、TCP 协议

1、特点

TCP 协议是面向连接的通信协议(需要服务端响应请求)

速度慢,但没有大小限制,数据安全

2、收发数据步骤及示例

public class Client {public static void main(String[] args) throws Exception {// 1、创建Socket对象,指定服务端的IP和端口Socket socket = new Socket("127.0.0.1", 8888);// 2、获取传输数据的流对象OutputStream os = socket.getOutputStream();InputStream is = socket.getInputStream();// 3、收发数据os.write("Nice to meet you".getBytes());byte[] data = new byte[1024];int len = is.read(data);String msg = new String(data, 0, len);String ip = socket.getInetAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);// 4、释放资源socket.close();}
}public class Server {public static void main(String[] args) throws Exception {// 1、创建ServerSocket对象,指定端口ServerSocket server = new ServerSocket(8888);System.out.println("waiting for client...");// 2、相应客户端发送的请求Socket socket = server.accept();// 3、获取传输数据的流对象OutputStream os = socket.getOutputStream();InputStream is = socket.getInputStream();// 4、收发数据byte[] data = new byte[1024];int len = is.read(data);String msg = new String(data, 0, len);String ip = socket.getInetAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);os.write("Nice to meet you too".getBytes());// 5、关流并释放资源socket.close();server.close();}
}

3、细节补充

(1)三次握手

第一次:客户端向服务器发送连接请求(SYN包)并等待服务器确认

第二次:服务器向客户端返回一个响应(SYN包 + ACK包)告诉客户端收到了请求

第三次:客户端向服务器再次发送确认信息(ACK包),连接建立

Tips:第三次握手是为了防⽌失效的连接请求突然传到服务器(如网络延迟的重复SYN包)造成单向连接

(4)四次挥手

第一次:客户端向服务器发送取消连接的请求(FIN包)

第二次:服务器返回一个响应(ACK包)告诉客户端收到了请求

服务器将最后的数据处理完毕

第三次:服务器向客户端发送确认取消连接的消息(FIN包)

第四次:客户端再次发送确认消息(ACK包),连接取消

http://www.lryc.cn/news/2395346.html

相关文章:

  • android lifeCycleOwner生命周期
  • 高防IP能抗住500G攻击吗?
  • 工作流引擎-10-什么是 BPM?
  • day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
  • 每日温度(力扣-739)
  • QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现
  • HarmonyOS鸿蒙系统深度运维指南
  • SpringBoot多租户系统的5种架构设计方案
  • 数据分析实战1(Excel制作报表)
  • 本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt
  • 设备健康管理的战略升维:用预测性维护重构企业竞争力
  • Redis事务详解:原理、使用与注意事项
  • 提升 GitHub Stats 的 6 个关键策略
  • CSS Animation 详解
  • LabVIEW 中内存释放相关问题
  • 【HarmonyOS 5】鸿蒙中的UIAbility详解(三)
  • 基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案
  • vue-11(命名路由和命名视图)
  • (附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用
  • Python打卡训练营Day42
  • 基于微信小程序的scratch学习系统
  • MATLAB实战:机器学习分类回归示例
  • 动态库导出符号与extern “C“
  • 小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧
  • `docker commit` 和 `docker save`区别
  • 【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
  • SCSAI平台面向对象建模技术的设计与实现
  • pikachu通关教程-CSRF
  • 智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代
  • Python爬虫实战:研究Aiohttp库相关技术