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协议: 规定了响应给浏览器的数据格式

每个连接一个客户端都新建一个线程池不好的,
可以使用线程池技术进行优化