当前位置:首页 > CN2资讯 > 正文内容

Java 服务器假死 java操作服务器

3天前CN2资讯


Tomcat简介

Tomcat服务器是一个轻量级的Java代码实现的Web服务器。这篇文章会讲述如何用Java实现一个简单的Tomcat服务器。

1.简易原理

  • Tomcat开始运行后,会在服务器上开一个端口(本文中用的是8888端口),在所开辟的端口上运行一个ServerScoket,执行accpet()方法等待浏览器访问。
  • 浏览器访问端口,ServerSocket的accept()方法返回一个运行在服务器端的socket,通过socket的getInputStream()方法和getOutputStream方法,可获得浏览器和服务器之间发送的内容和浏览器的响应内容()。
  • 这里我们主要获取浏览器的请求地址和参数,响应时根据浏览器所传的参数和地址,到服务器上去寻找对应的资源(目前只支持静态资源),将用户请求的资源转化为文件流,传输给前端(浏览器)。
  • 浏览器收到服务器的响应后,向用户展示界面。
  • 2.实现类

    主要分为以下几个类:
    (1) Server 用于加载并启动服务器
    (2) ServerThread 当接收到新请求时,开辟一个新的线程处理它
    (3) Request 用于获取请求的数据(主要是请求的地址和请求参数)
    (4) Response 用于响应请求(根据请求所获参数和地址,访问服务器上的资源)
    (5) GetParam 用于获取环境变量参数

    3.具体实现

    package TomcatServer.server; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import .ServerSocket; import .Socket; import java.util.Properties; public class Server { private ServerSocket server; //服务 private int port; //端口号 private static Properties prop; //用于读取配置文件 //配置参数读取位置 static { prop = new Properties(); try { prop.load(new FileInputStream(new File("src/TomcatServer/source/property.properties"))); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * @auther: Ragty * @describe: 初始化服务器 * @param: [] * @return: void * @date: 2019/1/24 */ public void init() { try { port = Integer.parseInt(prop.getProperty("port")); server = new ServerSocket(port); System.out.println("服务器启动"+ port + "端口"); } catch (IOException e) { e.printStackTrace(); } } /* * @auther: Ragty * @describe: 在当前线程内,创建一个Client服务 * @param: [] * @return: void * @date: 2019/1/25 */ public void recive() { try { System.out.println("收到新请求"); Socket client = server.accept(); //监听服务器,平时等待连接,有client则创建客户端实例(阻塞的) ServerThread thread = new ServerThread(client); //处理客户端请求,并返回请求页面 thread.start(); thread.join(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Server() {} /* * @auther: Ragty * @describe: 启动Tomcat服务器 * @param: [args] * @return: void * @date: 2019/1/25 */ public static void main(String[] args) { Server server2 = new Server(); server2.init(); while (true) { //一直等待用户访问定义端口,访问后,开辟新线程处理它 server2.recive(); } } }package TomcatServer.Request; import TomcatServer.Util.GetParam; import com.hjy.util.GetParm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import .Socket; import java.util.HashMap; import java.util.Map; public class Request { private Socket client; //客户端 private BufferedReader reader; private String url; //请求资源 private String method; //请求方式 private String protocal; //请求协议 private Map<String,String> map; //参数列表 private GetParam getParam; //请求参数分割工具 public Request() {} /* * @auther: Ragty * @describe: 接收并客户端(Client)发出的请求,获取请求的链接及参数 * @param: [client] * @return: * @date: 2019/1/25 */ public Request(Socket client) { this.client = client; map = new HashMap<>(); getParam = new GetParam(); try { reader = new BufferedReader(new InputStreamReader(client.getInputStream())); String firstLine = reader.readLine(); String[] spilt = firstLine.split(" "); method = spilt[0]; url = spilt[1]; protocal = spilt[2]; System.out.println(url); if (method.equalsIgnoreCase("get")) { if(url.contains("?")) { String[] split2 = url.split("[?]"); url = split2[0]; //重新定义url String property = split2[1]; map = getParam.getParam(property); //分割参数 } } else { int length = 0; while (reader.ready()) { //确保已经缓冲完毕 String line = reader.readLine(); if (line.contains("Content-Length")) { String[] spilt2 = line.split(" "); length = Integer.parseInt(spilt2[1]); } if (line.equals("")) { //Post方法无参数 break; } } String info = null; char[] ch = new char[length]; reader.read(ch , 0, length); info = new String(ch, 0, length); map = getParam.getParam(info); } } catch (IOException e) { e.printStackTrace(); } } public Socket getClient() { return client; } public void setClient(Socket client) { this.client = client; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public String getProtocal() { return protocal; } public void setProtocal(String protocal) { this.protocal = protocal; } }package TomcatServer.Response; import java.io.*; import .Socket; public class Response { private Socket client; private PrintStream ps; private String path = null; public Response() {}; /* * @auther: Ragty * @describe: 获取服务端传输给客户端的输出流 * @param: [client] * @return: * @date: 2019/1/24 */ public Response(Socket client) { super(); this.client = client; try { ps = new PrintStream(client.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } /* * @auther: Ragty * @describe:根据当前路径将服务器上有的资源用流传给客户端 * @param: [] * @return: void * @date: 2019/1/24 */ public void forword() throws FileNotFoundException { FileInputStream fis = null; try { fis = new FileInputStream(new File(path)); ps.println("HTTP/1.1 200 OK"); ps.println(); byte[] buf = new byte[1024]; int length = 0; while ( (length = fis.read(buf)) != -1 ) { ps.write(buf, 0, length); ps.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) {fis.close();} if (ps != null) {ps.close();} if (client != null) {client.close();} } catch (IOException e) { e.printStackTrace(); } } } /* * @auther: Ragty * @describe: 分情况处理请求Url(1.为空,返回默认资源 2.存在,加载该资源 3.不存在,返回错误信息) * @param: [url] * @return: void * @date: 2019/1/24 */ public void forword(String url) { if (url.equals("/")) { path = "src/TomcatServer/source/2.jpg"; } else { path = "src/TomcatServer/source" + url; File file = new File(path); if (!file.exists()) { path = "src/TomcatServer/source/error.html"; } } try { forword(); } catch (FileNotFoundException e) { e.printStackTrace(); } } }

    4.测试效果

    浏览器输入 http://localhost:8888 ,效果如下


    浏览器输入 http://localhost:8888/success.html ,效果如下


      你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/21023.html

      分享给朋友:

      “Java 服务器假死 java操作服务器” 的相关文章

      甲骨文注册流程详解:成功申请的关键步骤与技巧

      甲骨文(Oracle Cloud)的注册流程看似复杂,但只要事先做好准备,整个过程其实非常顺利。我自己在注册时感受到了这一点,以下就是我想和大家分享的步骤和经验。 申请前的准备工作 在我们开始注册之前,有几个准备工作是必须要做的。首先,创建一个国际邮箱是至关重要的。虽然国内的邮箱也可以使用,但我推荐...

      腾讯云国际站:助力企业全球化发展的云计算服务平台

      腾讯云国际站是腾讯云为全球用户打造的云计算服务平台,其目的是为企业和开发者提供强大的技术支持。这一平台的核心特点在于其全球化的服务网络与数据中心布局,让每位用户都能感受到来自不同地区的高效服务。 全球服务与数据中心特点 我对腾讯云国际站的全球服务网络感到非常惊艳。它在全球开通了21个地理区域,涵盖了...

      为小学生选择合适的VPS:安全、易用和高性价比的评测指南

      在这个数字化时代,网络安全受到越来越多人的重视。小朋友们在网络上探索新知识、与朋友沟通时,面对的不仅是丰富的学习资源,还有潜在的网络风险。此时,VPS(虚拟个人服务器)作为一个安全、稳定的网络环境,开始逐渐进入小学生的视野。家长和学校意识到,提供一个良好的网络环境,不仅能保护孩子免受不良信息的侵害,...

      原生IP的重要性及其在外贸中的应用价值

      原生IP的定义与特点 谈到原生IP,这个概念在网络世界中显得极为重要。简单来说,原生IP是指那些与虚拟专用服务器(VPS)所在国家一致的IP地址。这意味着,它们的注册信息和其实际位置是相符的,根本没有经过修改或伪造。这一点在外贸业务中尤为重要,很多情况下,企业需要保证他们的服务器IP地址真的是注册所...

      UCloud服务器性能与安全性的全面评测

      UCloud服务器概述 UCloud是一家专注于云计算服务的公司,提供多样的云服务器选项,适合不同业务需求。它不仅满足基本的计算、存储和网络功能,还在高可用性、高性能和安全性上表现出色。通过细致的产品设计,UCloud确保每一位用户都能在稳定的环境中运作,充分利用其提供的技术优势。 在使用UClou...

      域名购买推荐:如何选择最适合你的域名注册商

      域名购买推荐概述 在互联网时代,域名显得尤为重要。对于个人用户、企业甚至是初创团队来说,域名不仅是网站的门面,更是品牌形象和业务宣传的基石。记得我第一次建立网站时,选择一个合适的域名让我意识到它的价值。一个容易记住、与品牌相关的域名可以有效吸引流量,提升访问者的信任感。 在选购域名时,有几点基本原则...