第⼀章⽹络编程
1.1 概述
计算机⽹络:是指将地理位置不同的具有独⽴功能的多台计算机及其外部设备,通过通信线路连接起来,在⽹络
操作系统、⽹络管理软件及⽹络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
⽹络编程:在⽹络通信协议下,实现⽹络互连的不同计算机上运⾏的程序间可以进⾏数据交换。(可以通过我们
编写的⽹络程序基于互联⽹去访问别⼈电脑上的程序和资源。)
⽬前的⽹络程序分两种结构:CS / BS
1.2 CS / BS
软件架构(结构) 的两种不同的表现形式
C/S结构:全称为 Client/Server 结构,是指客户端和服务器结构。常⻅程序有 QQ ,百度⽹盘等软件。
特点: ⼀般服务端仅仅安装了数据库和数据存储,所有程序代码(功能/界⾯) 都编写在客户端软件中.
优点: 直观,⽤户体验好,界⾯美观,安全性⾼等.
缺点: 每次升级,需要重新安装,移植性较低,开发和维护成本较⾼,不跨平台
B/S结构:全称为 Browser/Server 结构,是指浏览器和服务器结构。常⻅浏览器有⾕歌、⽕狐等。
特点: 在服务端编写代码,所有的业务逻辑都由服务端完成,客户端只负责界⾯渲染.
优点: 可移植性很⾼,开发和维护较好.
缺点: 以前⽤户体验不够好,界⾯不够丰富,安全性相对较低.
新型 BS 结构 : 需求和技术发展的产物
瘦客户端 : 传统的 B/S . 服务端: 负责业务逻辑; 客户端: 负责界⾯渲染.
富客户端 : 超级 BS=CS+BS , 界⾯华丽. 服务端:负责业务逻辑; 客户端: 负责界⾯渲染 + 少量的业务逻辑.
以上架构各有优势,但是⽆论哪种架构,都需要基于⽹络进⾏通信,那他们是如何通信的?
1.3 ⽹络通信三要素
1.3.1 IP 地址
IP地址:互联⽹协议地址(Internet Protocol Address)要想让⽹络中的计算机能够被识别,就必须为每台计
算机指定⼀个唯⼀的标识,通过改标识来找到相应的计算机,⽽IP就是这个标识。
IP地址分类
IPv4:是⼀个 32 位的⼆进制数,通常被分为 4 个字节,表示成a.b.c.d 的形式,例如 192.168.65.100 。
其中 a、b、c、d 都是0~255之间的⼗进制整数,那么最多可以表示⼤约43亿个。
IPv6:由于互联⽹的蓬勃发展,IP 地址的需求量愈来愈⼤,但是⽹络地址资源有限,使得 IP 的分配越发紧
张。有资料显示,全球 IPv4 地址在2011年2⽉分配完毕。
为了扩⼤地址空间,拟通过 IPv6 重新定义地址空间,采⽤128位地址⻓度,每 16个字节⼀组,分成8组⼗六进
制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 ,号称可以为全世界的每⼀粒沙⼦编上⼀个
⽹址,这样就解决了⽹络地址资源数量不够的问题。
域名: 映射到某个 ip 的⼀组英⽂单词组合(wolfcode.cn) ,为了更好记忆.
常⽤命令
查看本机 IP 地址,在控制台输⼊:
1
ipconfig
检查⽹络是否连通,在控制台输⼊:
ping 空格 IP地址/域名
ping wolfcode.cn
ping 120.78.159.117
特殊的 IP 地址
本机 IP 地址:127.0.0.1、localhost
1.3.2 端⼝号
⽹络的通信,本质上是两个进程(应⽤程序)的通信。每台计算机都有很多的进程,那么在⽹络通信时,如何区分
这些进程呢?
如果说IP地址可以唯⼀标识⽹络中的设备,那么端⼝号就可以唯⼀标识设备中的进程(应⽤程序)了。
端⼝号:⽤两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端⼝号⽤于⼀些知名的⽹络
服务和应⽤,普通的应⽤程序需要使⽤1024以上的端⼝号。如果端⼝号被另外⼀个服务或应⽤所占⽤,会导
致当前程序启动失败。
1.3.3 通信协议
⽹络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进⾏通信。这就
好⽐在道路中⾏驶的汽⻋⼀定要遵守交通规则⼀样,协议中对数据的传输格式、传输速率、传输步骤等做了
统⼀规定,通信双⽅必须同时遵守,最终完成数据交换。(⼈和⼈之间交流语⾔需互通)
java.net 包中提供了两种常⻅的⽹络协议的⽀持: UDP 和 TCP
1.3.3.1 UDP 协议
UDP (User Datagram Protocol) 是⽆连接通信协议,不建⽴逻辑连接,当⼀台计算机向另外⼀台计算机发送数据时,
发送端不会确认接收端是否存在,直接发数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
特点: ⾯向⽆连接的协议,消耗资源⼩,通信效率⾼,通常⽤于⾳频、视频等数据传输,因为偶尔丢失⼀两个数据包,不会对接收结果产⽣太⼤影响。
但是在使⽤ UDP 协议传送数据时,由于 UDP 的⾯向⽆连接性,不能保证数据的完整性,因此在传输重要数据时不建议使⽤ UDP 协议。
UDP通信过程如下图所示:
1.3.3.2 TCP 协议
1 TCP 协议概述
TCP(Transmission Control Protocol)协议是⾯向连接的通信协议,即在传输数据前先在客户端和服务器端建⽴
逻辑连接,然后再传输数据。它提供了两台计算机之间可靠⽆差错的数据传输。TCP通信过程如下图所示:
2 TCP 协议特点
⾯向连接的协议
建⽴连接,形成传输数据的通道。
传输数据⼤⼩不受限制
通过三次握⼿完成连接。
通过四次挥⼿断开连接。
TCP是基于 IO 流传输数据。
因为需要建⽴连接,效率会稍低但是可靠协议
第⼀次握⼿: 客户端询问服务器端是在线
第⼆次握⼿: 服务器端通知客户端在线并询问客户端是否在线
第三次握⼿: 客户端通知服务器还在线
建⽴连接通道,开始做数据传输
第⼀次挥⼿: 客户端请求断开连接
第⼆次挥⼿: 服务器发送已经知道要断开,之后把数据发送完.
第三次挥⼿: 服务器发送完数据通知客户端正式断开
第四次挥⼿: 客户端告知服务器确定要断开并等待 2MSL 之后断开
结论: 涉及到数据安全不可丢失的,使⽤ TCP,BS 底层就是使⽤ TCP 协议.
3 基于 TCP ⽹络编程
书写基于⽹络来传输数据的两个程序.
成员和职责:
客户端: 往服务端程序发送数据,然后接收服务端返回的数据.
服务端: 接收客户端程序发送的数据,并做出反馈.
TCP编程-客户端
步骤:
1:创建⼀个连接某个服务端的 Socket 对象
2:从Socket中拿到输出流往服务端发送数据
3:调⽤Socket对象对象 shutdownOutput ⽅法通知服务端数据发送完毕
4:从Socket中拿到输⼊流获取服务端回馈的数据
5:调⽤Socket对象对象 shutdownInput ⽅法通知服务端数据接收完毕
6:关闭Socket对象
此时由于没有服务端,所以三握⼿不能成功,肯定报错
要想检验该程序是否正确,必须要先把服务端实现之后并正常启动才能验证客户端编写是否正确
接下来就是要编写服务端
TCP编程-服务端
步骤:
1:创建⼀个服务端对象(ServerSocket)
2:侦听客户端的连接,获取和客户端通信的Socket对象
3:从Socket获取输⼊流,接收服务器发送的数据
4:调⽤Socket对象对象shutdownInput⽅法通知客户端数据接收完毕
5:从Socket中拿到输出流往客户端发送数据
6:调⽤Socket对象对象shutdownOutput⽅法通知客户端数据发送完毕
7:关闭Socket对象
注意: 服务端⼀般都是⻓期开启的,因为服务端⼀旦关闭就不能给客户端提供服务了.
最终⽬标: 浏览器和 Java 程序交互,能显示 Java 程序(数据库)中的数据.
浏览器和服务端程序交互
由于使⽤浏览器接收到的数据是⼀⾏⼀⾏,所有咱们把数据接收改为⼀⾏⼀⾏接收,反馈也改为⼀⾏⼀⾏输出.
以上程序已经实现可以和浏览器进⾏通信,但是存在许多的问题:
1:该程序在并发的情况下,效率低
2:启动服务绑定的端⼝是写死了,万⼀该端⼝被其他程序占⽤,则服务器⽆法启动
3:以上编程模型中的 IO 是属于阻塞IO,传输数据的效率极低等等.
解决: 使⽤别⼈封装好,写好的服务端程序.(软件服务器: Tomcat)
第⼆章 Tomcat 服务器
2.1 WEB 资源概述
2.1.1 什么是 web 资源
浏览器⽹⻚上看到的所有内容都称为 web 资源,⽐如⽂字,图⽚,⾳频,视频,链接等等内容。
2.1.2 Web资源分类
分类
概述
使⽤的技术
静态资源是相对于动态资源⽽⾔,是指没有后台数据库、
不含程序和⼀些不可交互的⽹⻚。你编的是什么它显示的
就是什么、不会有任何改变。
静态资源
HTML/CSS/JS
动态资源会因时因⼈⽽异,以数据库为基础
每次访问内容都可能不⼀样
动态资源
JSP / Servlet
2.2 什么是服务器
2.2.1 服务器分类
软件服务器: 其实就是⼀个软件:提供了B(browser)/S(server)应⽤运⾏的环境(管理了Web应⽤)
作⽤:可以将我们开发好的静态资源或动态资源提供给外界(浏览器)访问。
硬件服务器: 其实就是⼀台电脑,该电脑安装了软件服务器。
2.2.2 软件服务器分类
http 服务器:⽤于运⾏静态的⽹⻚(html)
Web服务器:实现了 JavaEE 部分规范(⽐如Servlet/JSP)、没有实现 JavaEE 中的 EJB 规范。
常⽤的 Web服务器有:Tomcat(Java代码写的,开源的服务器), Jetty 等
应⽤服务器:实现了 JavaEE 全部的规范/⽀持 EJB 的:TomEE,GlassFish,JBoss,Weblogic,WebSphere
2.2.3 JavaEE 规范
在 Java 中所有的服务器要实现⼀组 sun 公司规定的接⼝,这些接⼝称为 JavaEE 规范。不同⼚商的 JavaWeb
服务器都实现了这些接⼝。在 JavaEE 中⼀共有 13 种规范。
常⻅的 JavaEE 规范有: JSP、Servlet、JDBC、XML、EJB
2.3 Tomcat 安装配置
2.3.1 Tomcat 下载
apache
tomcat 的产品⻚⾯:
2.3.2 Tomcat安装
解压即完成安装!注意事项:安装路径不能包含中⽂或空格等特殊符号。
2.3.3 Tomcat 环境变量配置
Tomcat 是使⽤ Java 语⾔编写的⼀个服务器(程序),要运⾏Tomcat必须得有 jre。必须先配置 JAVA_HOME 或者
JRE_HOME 的环境变量⼀般的我们只配置 JAVA_HOME。
上⾯是设置 JAVA_HOME 环境变量,启动 Tomcat 需要执⾏安装⽬录下的 bin ⽬录下⾯的 startup.bat 可执⾏⽂
件
2.3.4 Tomcat 启动和关闭
1. 启动:双击 bin/startup.bat
测试是否可以访问
2. 关闭:运⾏的是 bin/shutdown.bat
再次访问
2.4 修改 Tomcat 的端⼝号
Tomcat 的默认端⼝是 8080 HTTP 80。所以在访问 8080 端⼝的 Tomcat 中的资
源时,必须要加上端⼝号
如果想在访问的时候不加端⼝号,我们可以将 tomcat 的端⼝号修改为80。
修改 Tomcat 安装⽬录下 /conf/server.xml ⽂件中默认第 69 ⾏,将 8080 修改为 80
配置⽂件改变后需要重新启动 Tomcat,然后访问地址上就不需要输⼊端⼝号了。
2.5 Tomcat ⽬录结构
⽬录
作⽤
bin
启动和关闭Tomcat可执⾏⽂件
配置⽂件夹,有些重要配置⽂件在这下⾯。如:server.xml, web.xml等不建议乱修改,可能导致
Tomcat不能启动
conf
lib
Tomcat使⽤时依赖的⼀些第三⽅jar包
logs
⽇志记录⽂件,记录服务器运⾏过程中⼀些事件。包括运⾏过程中出现异常
临时⽂件夹,保存服务器运⾏过程中⽣成的⼀些垃圾⽂件
我们做好的项⽬发布的⽬录,可以通过浏览器来直接访问
ROOT⽬录:在浏览器上看到的欢迎⻚⾯,在这个⽬录下
temp
webapps
work
Tomcat ⼯作⽬录,存储 Tomcat 运⾏过程中产⽣的⽂件,⽐如 jsp 翻译后的class⽂件
2.6 Tomcat 运⾏常⻅问题
2.6.1 未设置 JAVA_HOME 环境变量
出错信息:没有 JAVA_HOME 的配置,执⾏ startup.bat ,窗⼝⼀闪⽽过,⽤ cmd 运⾏ startup.bat 会报⼀下环境变
量没配置问题.
解决办法:配置 JAVA_HOME 环境变量
2.6.2 端⼝号被占⽤
出错信息: 地址被占⽤,端⼝号被占⽤
也可以通过⽇志⽂件看得到同样的错误信息:⽇志⽂件位置:安装⽬录/logs⽬录下
解决⽅法
⽅法⼀:找到占⽤ 8080 端⼝的程序并中⽌
⽅法⼆:修改 Tomcat 的端⼝号为其他,⽐如 9090。修改配置⽂件:tomcat/conf/server.xml
修改之后重启Tomcat服务器。
2.6.3 出现 404 的错误提示
当前访问的资源不存在的时候就报404错误. 此时的问题,是我们⾃⼰造成的,把资源的名字写错了或者说根本就没
有此资源。
⽂件编码和内容编码不⼀致的问题,写了中⽂出错
2.7 Tomcat 部署项⽬
了解,推荐掌握第⼆种,虚拟⽬录配置.
2.7.1 web项⽬标准结构
2.7.2 web 项⽬部署⽅式
⽅式1:webapps
在 tomcat/webapps ⽬录下创建⼀个⽂件夹 PSS,在⽂本夹下⾯有⼀个 abc.html
启动服务器并通过浏览器访问:
⽅式2:虚拟⽬录(推荐)
⽅式1, 发布项⽬的缺点:发布在 webapps 下,webapps 项⽬越多,导致 Tomcat 启动越慢。
Context 标签
在conf/server.xml⽂件的 host 元素中配置 Context 标签
说明
虚拟访问⽬录的名称
path 属性
配置的名称必须是唯⼀的
docBase 属性
Web 应⽤所在⽬录
将 pss 项⽬存放在:D://openSource/下
找到 tomcat/conf/server.xml ⽂件,在 host 元素写下⾯的代码
启动服务器并通过浏览器访问:
⽅式3:配置独⽴ xml ⽂件
1. 在 tomcat/conf ⽬录下新建⼀个 Catalina⽬录(如果已经存在⽆需创建)
2. 在Catalina ⽬录下创建 localhost ⽬录
3. 在 localhost 中创建 xml 配置⽂件,名称可以任意:qq(注:这个名称是浏览器访问路径)
4. 在 xml ⽂件添加内容为
<Context docBase="D://openSource/pss" />
5. 重启服务器并浏览器访问
命令修改⽂件名称为空
2.8 IDEA 中部署项⽬
2.8.1 IDEA 绑定 Tomcat
我们要将 idea 和 tomcat 集成到⼀起,可以通过 idea 就控制 tomcat 的启动和关闭
1. 编辑运⾏配置
2. 添加 Tomcat 的配置信息
如果看不到 Tomcat Server,点下⾯的 xx more items
3. 配置服务器详细信息
第 1 次配置需要点击 Configure...按钮关联本地Tomcat安装路径
2.8.2 在 IDEA 部署 WEB 项⽬
1. 创建 JavaWeb 项⽬
2. 创建好的 WEB 项⽬结构
3. 在web⽬录下创建⼀个 index.html⽂件
4. 部署项⽬到 Tomcat 服务器 (编辑配置
1. 点击 Deployemet (在导⼊项⽬时,是没有导⼊项⽬到tomcat 服务器,需要在此处去加⼊项⽬)
2. 点击 Server 可以看到所有详细信息
2.8.2 在 IDEA 中启动服务器
1. 点右上⻆的启动图标,启动Tomcat服务器
2. 控制台显示服务器启动的状态信息
3. 浏览器测试访问