网络编程与Tomcat服务器

网络编程

在这里插入图片描述
计算机网络 : 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

网络编程 : 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换(可以通过我们编写的网络程序基于互联网去访问别人电脑上的程序和资源)

目前网络程序分为两种结构 : CS / BS
C / S结构 : 全称为Client / Server 结构,是指客户端和服务器结构,常见的程序有QQ,百度网盘等软件
特点 : 一般服务端仅仅安装了数据库和数据存储,几乎所有程序代码都写在客户端软件中
优点 : 直观,用户体验好,界面美观,安全性高等
缺点 : 每次软件升级,需要重新安装,移植性较低,开发和维护成本较高,代码不跨平台
在这里插入图片描述

B / S结构: 全称为 Browser / Server结构,是指浏览器和服务器结构,常见的浏览器有谷歌,火狐等
特点 : 在服务端编写代码,所有的业务逻辑都由服务端完成,客户端只负责接收数据进行渲染界面
优点 : 可移植性很高,开发维护较好
缺点 : 以前用户体验不够好,界面不够丰富,安全性较低
在这里插入图片描述
**新型 BS 结构 : **需求和技术发展的产物
瘦客户端 : 传统的 B/S, 服务端:负责业务逻辑 ; 客户端: 负责界面渲染
富客户端 : 超级B/S = C/S + B/S ,界面华丽,服务端: 负责业务逻辑 , 客户端:负责界面渲染 + 少量的业务逻辑

以上架构各有优势,但无论是哪种架构,都需要基于网络通信

网络通信三要素

在这里插入图片描述

IP地址

IP地址 : 互联网协议地址(Intemet Protocol Address) , IP地址是计算机在网络中的唯一标识,
域名 : 映射到某个ip的一组英文单词组合,如www.baidu.com , 为了想要访问这个地址的用户更好的记忆
常用命令
查看本机ip地址,在控制台输入

ipconfig

检查网络是否连通,在控制台输入

ping ip地址/域名
如 ping www.jd.com

特殊的IP地址
本机ip地址 : 127.0.0.1 , localhost

端口号

网络的通信,本质是两个进程(应用程序)的通信,每台计算机都有很多的进程,那么在网络通信时,端口号就是可以区别一台计算机中的唯一进程(应用程序)了
端口号 : 用两个字节表示的整数,它的取值范围是0-65535,其中,0-1023这个范围的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号,如果端口号被另一个服务或应用所占用,会导致当前程序启动失败

通信协议

网络通信协议 : 通信协议是计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信,协议中对数据的传输格式,传输速率,传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换

java.net包中提供了两种常见的网络协议的支持 : UDP和TCP

UDP 协议

UDP (User Datagram Protocol) 是⽆连接通信协议,不建⽴逻辑连接,当⼀台计算机向另外⼀台计算机发送数据时,发送端不会确认接收端是否存在,直接发数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

特点: ⾯向⽆连接的协议,消耗资源⼩,通信效率⾼,通常⽤于⾳频、视频等数据传输,因为偶尔丢失⼀两个数据包,不会对接收结果产⽣太⼤影响。
但是在使⽤ UDP 协议传送数据时,由于 UDP 的⾯向⽆连接性,不能保证数据的完整性,因此在传输重要数据时不建议使⽤ UDP 协议。

UDP通信过程如下图所示
在这里插入图片描述

TCP 协议

TCP(Transmission Control Protocol)协议是⾯向连接的通信协议,即在传输数据前先在客户端和服务器端建⽴逻辑连接,然后再传输数据。它提供了两台计算机之间可靠⽆差错的数据传输。

TCP通信过程如下图所示
在这里插入图片描述
TCP 协议特点

  • ⾯向连接的协议
  • 建⽴连接,形成传输数据的通道。
  • 传输数据⼤⼩不受限制
  • 通过三次握⼿完成连接。
  • 通过四次挥⼿断开连接。
  • TCP是基于 IO 流传输数据。
  • 因为需要建⽴连接,效率会稍低但是可靠协议

三次挥手完成连接

第⼀次握⼿: 客户端询问服务器端是在线
第⼆次握⼿: 服务器端通知客户端在线并询问客户端是否在线
第三次握⼿: 客户端通知服务器还在线
建⽴连接通道,开始做数据传输

四次挥⼿断开连接

第⼀次挥⼿: 客户端请求断开连接
第⼆次挥⼿: 服务器发送已经知道要断开,之后把数据发送完.
第三次挥⼿: 服务器发送完数据通知客户端正式断开
第四次挥⼿: 客户端告知服务器确定要断开并等待 2MSL 之后断开

涉及到数据安全不可丢失的,使⽤ TCP,BS 底层就是使⽤ TCP 协议.

基于 TCP ⽹络编程演示

书写基于⽹络来传输数据的两个程序.
成员和职责:
客户端: 往服务端程序发送数据,然后接收服务端返回的数据.(例如浏览器)
服务端: 接收客户端程序发送的数据,并做出反馈.

TCP编程-客户端

步骤:

  1. 创建⼀个连接某个服务端的 Socket 对象
  2. 从Socket中拿到输出流往服务端发送数据
  3. 调⽤Socket对象对象 shutdownOutput ⽅法通知服务端数据发送完毕
  4. 从Socket中拿到输⼊流获取服务端回馈的数据
  5. 调⽤Socket对象对象 shutdownInput ⽅法通知服务端数据接收完毕
  6. 关闭Socket对象
public class Demo {
    public static void main(String[] args) throws Exception {
    	//创建⼀个连接某个服务端的 Socket 对象
        Socket socket = new Socket("127.0.0.1", 8888);
        //从Socket中拿到输出流往服务端发送数据
        OutputStream out = socket.getOutputStream();
        out.write("服务器,你好!".getBytes("UTF-8"));
        //调⽤Socket对象对象 shutdownOutput ⽅法通知服务端数据发送完毕
        socket.shutdownOutput();
        
        //从Socket中拿到输⼊流获取服务端回馈的数据
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = is.read(buffer)) != -1){
            System.out.println(new String(buffer,0,len,"UTF-8"));
        }
        //调⽤Socket对象对象 shutdownInput ⽅法通知服务端数据接收完毕
        socket.shutdownInput();
        //关闭Socket连接对象
        socket.close();
    }

}

TCP编程-服务端

步骤:

  1. 创建⼀个服务端对象(ServerSocket)
  2. 侦听客户端的连接,获取和客户端通信的Socket对象
  3. 从Socket获取输⼊流,接收服务器发送的数据
  4. 调⽤Socket对象对象shutdownInput⽅法通知客户端数据接收完毕
  5. 从Socket中拿到输出流往客户端发送数据
  6. 调⽤Socket对象对象shutdownOutput⽅法通知客户端数据发送完毕
  7. 关闭Socket对象
public class Demo {
    public static void main(String[] args) throws Exception {
    	//创建⼀个服务端对象(ServerSocket)
        ServerSocket ss = new ServerSocket(8888);
        //侦听客户端的连接,获取和客户端通信的Socket对象(正常是死循环,因为有多个客户端)
        Socket accept = ss.accept();
		//从Socket获取输⼊流,接收服务器发送的数据
        InputStream is = accept.getInputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = is.read(buffer)) != -1) {
            System.out.println(new String(buffer, 0, len, "UTF-8"));
        }
        //调⽤Socket对象对象shutdownInput⽅法通知客户端数据接收完毕
        accept.shutdownInput();

		//从Socket中拿到输出流往客户端发送数据
        OutputStream out = accept.getOutputStream();
        out.write("客户端,你好!".getBytes("UTF-8"));
        //调⽤Socket对象对象shutdownOutput⽅法通知客户端数据发送完毕
        accept.shutdownOutput();
        //关闭Socket对象
        accept.close();
    }

}

注意: 服务端⼀般都是⻓期开启的,因为服务端⼀旦关闭就不能给客户端提供服务了.
最终⽬标: 浏览器和 Java 程序交互,能显示 Java 程序(数据库)中的数据.

浏览器和服务端程序交互

由于使⽤浏览器接收到的数据是⼀⾏⼀⾏,所有咱们把数据接收改为⼀⾏⼀⾏接收,反馈也改为⼀⾏⼀⾏输出

public class Demo {
    public static void main(String[] args) throws Exception {
    	//创建⼀个服务端对象(ServerSocket)
        ServerSocket serverSocket = new ServerSocket(8888);
        while(true){
        	//循环监听客户端发来的请求,开启线程去处理
            new Thread(new RequestHandler(serverSocket.accept())).start();
        }
    }
}

//处理请求类
public class RequestHandler implements Runnable {
    private Socket socket;

    public RequestHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
        	//将请求的信息放进缓存流
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String info = "";
            while(!(info = br.readLine()).equals("")){
            	//打印请求带来的信息
                System.out.println(info);
            }
            //接受请求完毕
            socket.shutdownInput();
            
			//响应字符串
            PrintStream printStream = new PrintStream(socket.getOutputStream());
            //响应行,响应头,响应内容
            printStream.println("HTTP/1.1 200 OK");
            printStream.println("Content-Type: text/html;charset=utf-8");
            printStream.println();
            printStream.println("<!DOCTYPE html>\n" +
                    "<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "    <title>Title</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "    成功访问到服务器\n" +
                    "</body>\n" +
                    "</html>");
            //响应完毕,关闭连接
            socket.shutdownOutput();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
以上程序已经实现了可以和浏览器进⾏通信,但是存在许多的问题:

  1. 该程序在并发的情况下,效率低
  2. 启动服务绑定的端⼝是写死了,万⼀该端⼝被其他程序占⽤,则服务器⽆法启动
  3. 以上编程模型中的 IO 是属于阻塞IO,传输数据的效率极低等等.
    解决: 使⽤别⼈封装好,写好的服务端程序.(软件服务器: Tomcat)

Tomcat 服务器

什么是 web 资源

浏览器⽹⻚上看到的所有内容都称为 web 资源,⽐如⽂字,图⽚,⾳频,视频,链接等等内容。

Web资源分类

分类概述使⽤的技术
静态资源静态资源是相对于动态资源⽽⾔,是指没有后台数据库、不含程序和⼀些不可交互的⽹⻚。你编的是什么它显示的就是什么、不会有任何改变。HTML/CSS/JS
动态资源动态资源会因时因⼈⽽异,以数据库为基础每次访问内容都可能不⼀样JSP / Servlet

什么是服务器

服务器分类

软件服务器: 其实就是⼀个软件:提供了B(browser)/S(server)应⽤运⾏的环境(管理了Web应⽤) ,作⽤:可以将我们开发好的静态资源或动态资源提供给外界(浏览器)访问。
硬件服务器: 其实就是⼀台电脑,该电脑安装了软件服务器。

软件服务器分类

http 服务器:⽤于运⾏静态的⽹⻚(html)
Web服务器:实现了 JavaEE 部分规范(⽐如Servlet/JSP)、没有实现 JavaEE 中的 EJB 规范。常 ⽤的 Web服务器有:Tomcat(Java代码写的,开源的服务器), Jetty 等
应⽤服务器:实现了 JavaEE 全部的规范/⽀持 EJB 的 : TomEE,GlassFish,JBoss,Weblogic,WebSphere

JavaEE 规范

在 Java 中所有的服务器要实现⼀组 sun 公司规定的接⼝,这些接⼝称为 JavaEE 规范。不同⼚商的 JavaWeb服务器都实现了这些接⼝。在 JavaEE 中⼀共有 13 种规范。
常⻅的 JavaEE 规范有: JSP、Servlet、JDBC、XML、EJB

Tomcat 安装配置

Tomcat 下载

apache官⽹。www.apache.org
tomcat 的产品⻚⾯: http://tomcat.apache.org/

Tomcat安装

解压即完成安装!注意事项:安装路径不能包含中⽂或空格等特殊符号。

Tomcat 环境变量配置

Tomcat 是使⽤ Java 语⾔编写的⼀个服务器(程序),要运⾏Tomcat必须得有 jre。必须先配置 JAVA_HOME 或者JRE_HOME 的环境变量 ⼀般的我们只配置 JAVA_HOME。

Tomcat 启动和关闭

启动:双击 bin/startup.bat ,浏览器测试是否可以访问
关闭:运⾏的是 bin/shutdown.bat

修改 Tomcat 的端⼝号

Tomcat 的默认端⼝是 8080。但是 HTTP 协议的默认访问的端⼝是 80。所以在访问 8080 端⼝的 Tomcat 中的资源时,必须要加上端⼝号 http://localhost:8080/index.jsp
如果想在访问的时候不加端⼝号,我们可以将 tomcat 的端⼝号修改为80。
修改 Tomcat 安装⽬录下 /conf/server.xml ⽂件中默认第 69 ⾏,将 8080 修改为 80
配置⽂件改变后需要重新启动 Tomcat,然后访问地址上就不需要输⼊端⼝号了。

Tomcat ⽬录结构

⽬录名作⽤
bin启动和关闭Tomcat可执⾏⽂件
conf配置⽂件夹,有些重要配置⽂件在这下⾯。如:server.xml, web.xml等 不建议乱修改,可能导致Tomcat不能启动
libTomcat使⽤时依赖的⼀些第三⽅jar包
logs⽇志记录⽂件,记录服务器运⾏过程中⼀些事件。包括运⾏过程中出现异常
temp临时⽂件夹,保存服务器运⾏过程中⽣成的⼀些垃圾⽂件
webapps我们做好的项⽬发布的⽬录,可以通过浏览器来直接访问
ROOT⽬录在浏览器上看到的欢迎⻚⾯,在这个⽬录下
workTomcat ⼯作⽬录,存储 Tomcat 运⾏过程中产⽣的⽂件,⽐如 jsp 翻译后的class⽂件

Tomcat 部署项⽬

web项⽬标准结构

在这里插入图片描述

web 项⽬部署⽅式(运维人员掌握部署)

⽅式1:webapps
在 tomcat/webapps ⽬录下创建⼀个项目⽂件夹,将资源按照上面结构放在文件夹中,再启动猫
在这里插入图片描述
启动成功后通过IP地址:端口号/项目文件夹名/资源名 进行访问

⽅式2:虚拟⽬录(推荐)
⽅式1, 发布项⽬的缺点:发布在 webapps 下,webapps 项⽬越多,导致 Tomcat 启动越慢。

在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. 重启服务器并浏览器访问

IDEA 中部署项⽬(开发人员掌握)

我们要将 idea 和 tomcat 集成到⼀起,可以通过 idea 就控制 tomcat 的启动和关闭

  1. 编辑运⾏配置
    在这里插入图片描述

  2. 添加 Tomcat 的配置信息,选择本地的猫
    在这里插入图片描述

  3. 配置服务器详细信息
    在这里插入图片描述
    第 1 次配置需要点击 Configure…按钮关联本地Tomcat安装路径
    在这里插入图片描述

在 IDEA 部署 WEB 项⽬

  1. 创建 JavaWeb 项⽬
    在这里插入图片描述
    在这里插入图片描述
  2. 创建好的 WEB 项⽬结构
    在这里插入图片描述
  3. 在web⽬录下创建⼀个 index.html⽂件
  4. 部署项⽬到 Tomcat 服务器 (编辑配置)点击 Deployemet (在导⼊项⽬时,是没有导⼊项⽬到tomcat 服务器,需要在此处去加⼊项⽬)
    在这里插入图片描述
    在这里插入图片描述
    点击 Server 可以看到所有详细信息
    在这里插入图片描述
  5. 在 IDEA 中启动服务器
    在这里插入图片描述

版权声明:本文为cylcjsg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。