[Java]网络编程

java.net.*包下提供了网络编程的解决方案

通信架构

CS架构

客户端

客户端需要开发

用户需要安装

服务端

需要开发

BS架构

浏览器

不需要开发

需要安装浏览器

服务器

需要开发

网络通信三要素

IP地址

是设备在网络中的唯一标识, 全称 互联网协议地址

分类

公网IP 可以连接互联网的IP地址

内网IP 只能在组织或机构内部使用的地址

192.168. 开头的就是常见的局域网地址

范围在 192.168.0.0 -- 192.168.255.255

特殊IP

172.0.0.1 localhost 代表本机IP

命令

ipconfig //查看本机IP地址

ping IP地址 // 检查网络是否连通

IP域名

IP域名是IP地址的名字. 方便记忆

用IP域名访问网络时,

会首先去本机的dns服务器解析域名, 拿到IP地址,通过IP地址访问资源

形式

IPV4

4个字节组成一个IP地址, 一般用十进制的形式表示

大约能够标记40亿台设备

IPV6

共128位, 号称可以为每粒沙子编号

分成8段表示, 每段每4位编码成一个十六进制位表示, 数之间用冒号分开

InetAddress

代表IP地址

端口

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

分类

周知端口: 0-1023, 被预先定义的知名应用占用(HTTP占用80, FTP占用21)

注册端口: 1024-49151, 分配给用户进程或应用

动态端口: 4952-65535, 一般不固定分配给某进程, 而是动态分配

我们开发的程序一般选择注册端口, 一个设备中不能出现端口一样的程序, 否则报错

协议

网络链接和数据传输的规则

OSI网络参考模型: 全球网络互联标准

TCI/IP网络模型: 实际的国际标准

UDP用户数据报协议

特点: 无连接,不可靠通信

优势: 通信效率高, 语音通话/视频直播

原理: 不事先建立连接, 数据按照包发送, 只管发出,其他不管

TCP传输控制协议

特点: 面向连接, 可靠通信

优势: 通信效率较低, 网页/文件下载/支付

原理:

三次握手建立连接

目的: 确认双方的收发都没有问题

客户端向服务端发起连接请求, 服务端确定客户端发送无问题

服务端给客户端返回响应, 客户端确定服务端收发无问题

客户端向服务端发送确定信息, 建立连接,服务端确定客户端接受无问题

传输数据进行确认,

数据传输会进行确定, 以保证数据传输的可靠性

四次挥手断开连接,

目的: 确认双方数据的收发都已经完成

客户端向服务端发送断开请求, 请求断开

服务端先返回等待的响应消息, 等待

服务端确认无误后再返回可以断开的消息, 可以断开

客户端发送确认断开的消息, 确认断开

UDP通信

java提供了java.net.DatagramSocket类实现UDP通信

创建客户端/服务端

创建数据包

单发单收

客户端

创建客户端对象

创建数据包对象, 封装要发送的数据

使用客户端对象的方法发送数据

释放资源 close()

服务端

创建服务端对象

创建数据包对象, 封装要接收数据

使用服务端对象的方法接收数据

释放资源 close()

多收多发

使用死循环改造程序

配置程序多开

TCP通信

java提供了一个java,net.Socket类来实现TCP通信

客户端

客户端程序就是通过java.net包下的Scoket类实现的

服务端

服务端就是通过java.net包下的ServerSocket类来实现的

单发单收

客户端

创建客户端的Scoket对象, 请求与服务端的连接

使用Scoket对象的方法获取字节输出流

使用字节输出流完成数据的发送

释放资源, 关闭scoket管道

服务端

创建ServerSocket对象, 注册服务端端口

调用ServerSocket对象的方法,等待客户端的连接,并获得Socket管道对象

通过Socket对象的方法得到字节输入流, 完成数据的接受

释放资源,关闭socket管道

多发多收

通过循环多发多收

同时接收多个客户端

主线程负责接受客户端连接

客户端连接后, 新建子线程, 处理消息数据

综合案例

即时通信-群聊

模式

客户端->服务端通信

客户端->客户端通信

简易的BS架构

HTTP协议: 规定了响应给浏览器的数据格式

每个连接一个客户端都新建一个线程池不好的,

可以使用线程池技术进行优化

相关推荐
阿让啊几秒前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
椰羊~王小美6 分钟前
LeetCode -- Flora -- edit 2025-04-25
java·开发语言
凯酱14 分钟前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis
程序员总部24 分钟前
如何在IDEA中高效使用Test注解进行单元测试?
java·单元测试·intellij-idea
oioihoii26 分钟前
C++23中if consteval / if not consteval (P1938R3) 详解
java·数据库·c++23
孞㐑¥33 分钟前
C++11介绍
开发语言·c++·经验分享·笔记
佳腾_33 分钟前
【Web应用服务器_Tomcat】一、Tomcat基础与核心功能详解
java·前端·中间件·tomcat·web应用服务器
旦莫40 分钟前
Python 教程:我们可以给 Python 文件起中文名吗?
开发语言·python
异常君1 小时前
线程池隐患解析:为何阿里巴巴拒绝 Executors
java·后端·代码规范
Java技术小馆1 小时前
SpringBoot中暗藏的设计模式
java·面试·架构