目录
概述
客户端与服务器通过互联网连接实现资源共享,信息传递
计算机网络就是指将地理位置不同的具有独立功能的多台计算机和其外部设备,在网络操作系统,网络管理软件和网络通信协议的协调下,实现资源共享和信息传递的计算机系统
网络编程就是在网络通信协议下,实现网络互连的不同计算机运行的程序间可以进行数据交换
软件的架构:
1.C/S架构:Clinent/Server 客户端/服务器端。在客户本地有一个客户端程序,远程有一个服务器端程序。优点:有本地文件,用户体验好 缺点:开发安装部署维护麻烦(两端进行)
2.B/S架构:Browser/Server 浏览器/服务器端。只需要浏览器,用户通过不同的网址(URL)可以访问远程不同的服务器端程序。优点:开发安装部署维护简单 缺点:1. 如果应用过大,用户体验可能受到影响(硬件问题导致)。2. 对硬件要求过高
网络编程三要素
ip地址:网络通信中电子设备的唯一标示,识别要接收数据的计算机和要发送的计算机
端口:唯一标识设备中的应用程序,识别通信使用的应用程序。0~65536(1024以内的已被占用)
协议:位于同一网络中的计算机在网络通讯需要遵循的规则,对数据的传输格式,传输速率和传输步骤做了统一规定,通信双方必须遵守才能完成数据交换,如UDP/ip协议和TCP/ip协议
协议://IP地址:端口号?信息键值对1&信息键值对2
IP地址
分为ipv4和ipv6
ipv4:给每个主机分配一个32bit的地址,TCP/IP规定,每个IP地址长32bit,也就是4个字节,为了方便使用,ip地址通常写为十进制,中间用.分割,称为点分十进制表示法
IPV6:采用128位地址长度,每16个位为一组,分为8组十六进制数,解决网络地址不够的问题
常用DOS命令:ipconfig查看本机ip地址(通过交换机转换后的局域网ip可以重复)
ipconfig -all 查找物理网卡地址
ping IP地址/网址:检查网络是否连通
DNS:域名解析服务器,通过域名访问时,先访问DNS,将域名解析为ip地址返回给计算机,计算机再通过ip访问服务器,实现使用域名访问服务器
127.0.0.1/localhost 是回送地址,也可以代表本机地址,用来测试
InetAddress类
表示IP地址的对象
没有构造方法,也有不是静态的方法,那么我们可以静态调用其中的静态方法返回这个类的对象
getByName静态方法,参数为String类型,返回InetAddress,参数可以为机器名称也可以是IP地址
getHostAddress,无参数,返回String,返回IP地址字符串
getHostName,无参数,返回String,返回主机名
端口和协议
端口由两个字节表示0~65535,其中0~1023用于知名网络服务和应用,普通程序用1024及以上端口号,如果端口号被占用,会导致程序启动失败
UDP协议:用户数据报协议,无连接协议,发送端不会确定接收端是否存在,接收端也不会给发送端进行反馈,每个数据包控制在64kb以内,由于UDP协议消耗资源少,通信效率高,所以通常用于音频视频和普通数据的传输,但由于UDP面向无连接,不能保证数据的完整,可能丢失数据,所以重要数据不建议UDP。视频会议,qq聊天为UDP协议
TCP协议:传输控制协议,面向连接的协议,会在接收端和发送端建立逻辑连接,再传送数据,提供了可靠无差错的数据传输,保证数据安全,由客户端向服务端发出连接请求,每次连接的创建都需要三次握手。在发送数据的准备阶段,客户端与服务端的三次交互,保证数据的可靠:1.客服端发出连接请求,等待服务器确定2.服务器向客户端回送一个响应,通知客户端收到请求3.客户端再次向服务端发送确认信息,确认连接。消耗资源大,效率较低。上传文件,下载文件,浏览网页均为TCP协议。
两者属于7层分层模型中的传输层。应用层HTPP,DNS
UDP协议
在通信的两端各建立一个Socket对象,但这两个Socket只是发送和接收对象,因此基于UDP协议的通信双方,没有所谓的客户端和服务器
Java中DatagramSocket类是基于UDP的Scket,需要进行打包操作才能收发数据,在发送完成后需要关闭发送端。
发送数据:
DatagramSocket无参构造
close方法用于关闭发送端
send()方法,参数为数据报包(DatagramPacket类型)
DatagramPacket发送的构造方法:参数为(byte[]表示数据,int表示数据包长度,InerAddress类表示发送到的主机,int表示要发送到的应用程序的端口号)
接收数据:
DatagramSocket类创建接收的Socket对象时需要用带参构造,参数为端口号
receive()方法,参数为数据包,将接收的信息存入数据包中
DatagramPacket接收的构造方法:参数为(byte[]表示数据包的大小,可以大于发送的数据包大小,int表示数据包长度)
getData()方法无参数,返回byte[],返回数据缓冲区,用于解析数据包
getlen()方法,无参数,返回int,用于确定解析出来的数据包的长度
TCP协议
在通信两端各建立一个Socket对象,从而在通信两端形成虚拟链路,从而可以通过虚拟链路进行通讯
Java对TCP协议提供了良好的封装,用Socket代表两端的通信端口,并通过Socket产生IO流来通信
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
TCP发送数据步骤:1.创建客户端Socket对象2.获取输出流,写数据3.释放资源
只要创建客户端对象,就会完成TCP三次握手
Socket类:
构造方法:参数为InterAdress对象和int端口,或者String指定主机和int端口
成员方法:
getOutputStream,无参,返回OutputStream,返回套接字(客户端对象)的输出流
getInputStream方法获取输入流,用于读取服务器返回的响应消息
注意关闭流释放资源,关闭套接字对象资源
shutdownOutput(),禁用此客户端对象的输出流
TCP没有服务器无法运行
TCP接收数据步骤:1.创建服务端ServerSocket对象 2.监听客户端的连接3.获取输入流,读数据,并打印4.释放资源
ServerSocket实现类服务器套接字(服务器对象)
构造方法:参数为int表示端口
成员方法:accept方法,无参,返回Socket对象,侦听要连接到此的客户端并接受它,如果没有接收到客户端,服务器会一直处于开启状态
之后调用Socket对象的getInputStream方法获取输入流,之后再读取输入流中的内容,getOutputStream方法获取输出流,给客户端输出响应消息
注意关闭流释放资源,关闭套接字对象资源(Socket),ServerSocket服务器套接字一般不关闭
在客户端写完文件内容后,服务器并不清楚自己已经读完(阻塞式),这时需要客服端告知服务器文件传输结束,服务器接收到结束标记时停止读取请求消息,可以自定义一个标记或者在客户端使用Scoket对象调用shutdownOutput()方法,作为结束标记
同名文件被覆盖解决方法:
①自己使用Random生成随机数+“_”+时间毫秒值,作为文件名
②UUID类静态方法randomUUID(),无参数,返回UUID对象,生成永不重复的UUID,toSring()无参,返回String,,生成永不重复的随机字符串
③根据当前时间,进行日期分割,创建文件夹,存储文件
④定义计数器,加后缀编号,进行区分
服务器只能上传一次解决方法:
不关闭服务器,并将接收客户端及以后的代码加入死循环
一个用户占用服务器时,另一个用户只能等待,解决方法:
将服务器改为多线程版本,每次接收一个客户端后,开启一个新线程,执行上传任务,记得开启线程
频繁自己创建和关闭线程,消耗系统资源,降低效率,解决方法:
使用线程池
同时建议将线程任务单独写一个类,服务器中的客户端对象注入的形式传入。并以lambda创建Thread线程