网络:将不同区域的计算机连接到一起, 局域网,城域网,互联网
软件结构:
c/s结构:Client/Server
b/s结构:Browser/Server
网络编程,就是在一定的协议下,实现两台计算机的通信程序。
网络通信协议:在计算机网络中,连接和通信的规则被称为网络通信协议。它对数据的传输格式,传输速率,传输步骤都做了同意规定,通信双方必须同时遵守才能完成数据交换。
TCP/IP协议:传输控制协议/因特网互联协议。是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据传输的标准。采用4层分层模型。每一层都呼叫它的下一层所提供的协议来完成自己的需求。
协议分类:UDP:User Datagram Protocol。UDP是无连接通信协议。耗资小,通信效率高。
特点:数据被限制在64kb以内,超出这个范围就不能发送了。
TCP:传输控制协议(Transmission control Protocol)TCP是面向连接的通信协议。
每次连接要三次握手,断开时要四次挥手。
网络编程三要素:协议,IP地址,端口号
IPV4:四个字节,32位的二进制,a.b.c.d
IPV6:16个字节,128位的二进制,每16个字节一组,分成8组十六进制数。
常用命令:ipconfig:显示IP的配置信息。
ping 空格 IP地址:ping地址,检查网络是否联通。
端口号:用两个字节表示。一共有65535个。1024之前的端口号已经被系统分配给已知的网络软件。端口号不能重复。
常用的端口号:
1.80端口,网络端口
2.数据库:mysql:3306,oracle:1521
3.Tomcat服务器:8080
TCP通信程序:
Java中提供两个类实现TCP通信程序:
1.客户端:java.net.Socket
2.服务的:java.net.ServerSocket
TCP通信:面向连接的通信,客户端和服务器必须通过3此握手,建立逻辑连接,才能通信。
两端通信时步骤:
1.服务器程序,需要事先启动,等待客户端的连接。
2.客户端主动连接服务器端,连接成功才能通信。服务器不可用主动连接客户端。
3.这个连接包含一个对象,这个对象就是IO对象,客户端和服务端就可以使用。IO对象进行通信,通信的数据不仅仅是字符,所以IO对象是字节流对象。
实现步骤:
1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
2.使用对象中的getOutputStream()获取网络字节输出流Output Stream对象。
3.使用输出流是write,给服务器发送数据。
4.使用getInputStream()获取输入流对象InputStream。
5.使用input Stream对象的read,读取服务器回写的数据。
6.释放资源socket
注意:
1.客户端和服务端进行交互必须使用Socket中提供的网络流,不能自己创建。
2.必须服务端启动,客户端才能通过三次握手,连上服务端,否则会抛出异常。
TCP通信文件上传案例:
客户端读取本地的文件,把文件上传到服务器,服务器再把上传的文件保存到服务器的硬盘上
1.客户端使用本地的字节输入流,读取要上传的文件。
2.客户端使用网络字节输出流,把读取到文件上传到服务器
3.服务器使用网路字节输入流,读取客户端上传的文件。
4.服务器使用本地的字节输出流,把读取到的文件,保存到服务器的硬盘上。
5.服务器使用网路字节输出流,给客户端回写一个上传成功。
6.客户端使用网络字节输入流,读取服务器回写的数据。
7.释放资源。
注意:
客户端和服务器和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)
客户端和服务器之间进行读写,必须使用socket提供的字节流对象。
文件上传,就是文件复制
明确:
数据源: E:\\超人妈妈.apk
数据目的地: 服务器
实现步骤:
1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源。
2.创建一个客户端Socket对象,构造方法中绑定服务器IP地址和端口号
3.使用socket对象的get方法,得到网络字节输出输入流对象。
4.使用本地字节输入流对象的read方法,读取本地文件。
5.使用网络字节输出流把读取到的文件上传到服务器上。
6.使用网路字节输入流中的read方法读取服务器回写的数据。
7.释放资源,本地流对象关闭,socket对象关闭。
明确:
数据源:客户端上传的文件
目的地:服务器硬盘上
实现步骤:
1.创建一个服务器Server Socket对象,和系统要指定的端口号
2.使用ServerSocket对象中的方法accept,获取请求客户端是Socket对象
3.使用Sokect对象中的方法getInputStream,获取到网路字节输入流InputStream对象。
4.判断d:\\upload文件夹是否存在,不存在则创建。
5.创建一个文帝字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地。
6.使用网路输入流对象的read方法,读取客户端上传的文件。
7.使用本地输出流对象的write,方法,把读取到的文件保存到服务器的硬盘上
8.获取网络字节输出流对象,write方法给客户端回写--上传成功
9.释放资源 FileOutputStream,socket,ServerSocket
文件上传阻塞的问题:文件的结束标记读取不到,就会进入到阻塞状态,一直死循环等待结束标记。
解决方案:上传完文件,给服务器写一个结束标记。
void shutdownOutput()禁用此套接字,任何以前写入的数据都会被发送,并且后TCP的正常连接终止序列。
文件上传优化:文件命名,循环接收,多线程提高效率
1.while(true),让服务器一直在接收socket
2.使用多线程技术。
模拟BS服务器
http://127.0.0.1:8080/p/web/index.html
GET /day01-code/web/index.html HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1