基于JAVA的WEB服务器工作机制

JavaWeb快速入门(一)——新建JavaWeb项目 今天是暑期实训的第三天,上午继续昨天未讲完的任务java,比如:java的异常处理、java的集合等其它java常用知识,具体讲解链接如下。下午开始将JavaWeb服务器端程序开发,包含:处理请求和展示返回回来的数据。其中,处理请求分为四步:1、创建javaweb工程,2、开启服务器,3、编写处理请求的代码,4、运行。(一)创建javaweb工程 在创建之前,电脑需要有myeclip... 阅读详情

基于JAVA的WEB服务器工作机制

一个WEB服务器也被称为一个HTTP服务器,因为它使用HTTP协议和它的客户进行通讯,而这些客户通常是浏览器。 一个基于JAVA的WEB服务器使用了两个重要的类:java.net.Socket和java.net.ServerSocket,并且是通过HTTP消息进行通讯的。本文开头将讨论HTTP和这两个类,后面,将解释一个简单WEB服务器应用程序的工作机制。

超文本传输协议 (HTTP)

HTTP协议允许服务器和客户机通过INTERNET接收和发送数据。它是个请求和回应协议----客户机发送请求,服务器对请求给出回应。HTTP 使用可靠的TCP 连接,默认TCP端口是80。HTTP的第一版是HTTP/0.9,随后被 HTTP/1.0所取代。当前最新的版本是HTTP/1.1,这个在RPC2616规范文档中给出了定义。

这一章节简单讲叙了HTTP 1.1, 对于你理解WEB服务器应用程序发送的消息还是足够的。如果你很感兴趣,可以参考RFC 2616文档。

使用HTTP,客户端通过建立一个连接和发送一个HTTP请求来初始化事务会话,服务器联系客户端或者回应一个callback连接给客户端。 它们都可以中断连接。比如,在使用WEB浏览器时,你可以点击浏览器上的STOP按钮来停止文件下载进程,就有效的关闭了和这个WEB服务器的HTTP连接。

HTTP 请求(Requests)

一个HTTP request包含三个部分:

  • 方法,URL,协议/版本(Method-URI-Protocol/Version)
  • 请求包头Request headers
  • 实体包(Entity body)

下面给出一个HTTP请求的范例:

POST /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html 
Accept-Language: en-gb 
Connection: Keep-Alive 
Host: localhost 
Referer: http://localhost/ch8/SendDetails.htm 
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 
Content-Length: 33 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 

LastName=Franks&FirstName=Michael

请求的第一行就是method-URI-Protocol/Version。

POST /servlet/default.jsp HTTP/1.1

请求的是POST方法,后面的 /servlet/default.jsp 表示一个URL地址,HTTP/1.1表示协议的版本。

HTTP标准规范定义了一些请求方法,用来给每个HTTP请求所使用。HTTP 1.1支持7中请求方法: GET, POST, HEAD, OPTIONS, PUT, DELETE, 和 TRACE。 GET和POST 在INTERNET的应用程序中是使用最普遍的两个方法。

URI完整的指明了一个INTERNET资源。一个URI通常是相对于服务器的根目录被解释的。 因此,它总是使用符号(/)开头。一个URL实际是一个URI类型。协议版本表示当前正在使用的HTTP协议的版本。

请求包头(request header)包含了一些有用的客户机环境的信息和请求的实体(entity body)信息。比如,它可以包含浏览器使用的语言和实体的长度等等。每个请求包头都被CRLF(回车换行)序列所分离。

在先前的HTTP请求中,实体是下面简单的一行:

LastName=Franks&FirstName=Michael

在一个典型的HTTP请求中,这个实体能够很容易地变得更长。

HTTP响应(Responses)

和请求类似,一个HTTP响应也包含三个部分:

  • 协议状态 代码描叙(Protocol-Status code-Description)
  • 响应包头(Response headers)
  • 实体(Entity body)

下面是HTTP响应的一个简单范例:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

<html>
<head>
<title>HTTP Response Example</title></head><body>
Welcome to Brainy Software
</body>
</html>

第一行的响应包头和上面的请求包头很相似。 第一行告诉我们,协议是使用的HTTP1.1,响应请求已成功(200表示成功),一切已OK。

响应包头和请求包头相似,也包含一些有用的信息。响应的实体是HTML那一部分的内容。包头和实体也都是被CRLF序列分离开的。

Socket类

套接字(socket)是网络连接的一个端点。它使得应用程序能够通过网络进行读和写的操作。 通过在连接上发送和接受字节流,两个位于不同计算机的软件程序能够彼此相互通讯。为了发送一个消息到另一个程序,你需要知道对方机器的IP地址和socket端口号。在JAVA中,一个socket是由java.net.Socket类所表示的。

为了创建一个套接字,你可以使用Socket类的构造函数来完成。 这些构造函数接受主机名和端口:

public Socket(String host, int port)

host表示远程计算机名或者IP地址,port表示该远程应用的端口号。比如,要在80端口连接到yahoo.com,你需要构造下面的socket:

new Socket("yahoo.com", 80);

一旦你成功创建了一个Socket类的实例,就可以使用它来发送和接受字节流了。 要发送字节流,必须首先调用Socket类的getOutputStream 方法来获得一个java.io.OutputStream对象。要发送一个文本到远程应用程序,经常要构造一个从OutputStream对象返回的java.io.PrintWriter对象。要接收连接另一端的字节流,要调用Socket类的getInputStream方法,该方法是从 java.io.InputStream返回的。

下面的程序段创建了一个socket,和本地HTTP服务器(127.0.0.1代表本地)进行通讯,发送一个HTTP请求,然后从服务器接收一个响应。它创建了一个StringBuffer 来保存响应,并将它打印到控制台。

Socket socket    = new Socket("127.0.0.1", "8080");
OutputStream os   = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out   = new PrintWriter( socket.getOutputStream(), autoflush );
BufferedReader in = new BufferedReader( 
    new InputStreamReader( socket.getInputStream() ));

// send an HTTP request to the web server
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection: Close");
out.println();

// read the response
boolean loop    = true;
StringBuffer sb = new StringBuffer(8096);

while (loop) {
    if ( in.ready() ) {
        int i=0;
        while (i!=-1) {
            i = in.read();
            sb.append((char) i);
        }
        loop = false;
    }
    Thread.currentThread().sleep(50);
}

// display the response to the out console
System.out.println(sb.toString());
socket.close();

要从服务器得到一个确切的响应,你需要发送一个遵循HTTP协议规则的HTTP请求。如果你阅读了上面的那段"超文本传输协议(HTTP)" ,那么你就应该能够理解刚才上面建立socket的代码。

ServerSocket 类

Socket 类表示的是客户端的socket。无论什么时候,只要你想连接到一个远程服务器的应用,你都要构建一个socket。如果你想执行一个服务器应用程序,比如HTTP服务或者FTP服务的程序,那么你需要使用不同的途径。因为你的服务器必须一直是开机闲置,所以它不知道什么时候客户机试图来连接它。

这个时候,需要使用java.net.ServerSocket 类。它会实现一个服务器socket。一个服务器socket会等待来自客户端的连接。一旦它接收到一个连接请求,它就会创建一个  Socket 实例来处理和客户端通讯的问题。

要创建一个服务器socket,可以使用四种ServerSocket类构造方法中的一种来实现。你需要制定服务器socket监听的IP地址和端口。 典型的,IP地址如果是127.0.0.1,意味着服务器socket将监听本地机器。这个被监听的IP地址被认为是一种绑定地址。server socket的另一个重要属性是它的 backlog属性,它是在server socket拒绝连接请求前,能够接受的连接请求的最大队列长度。

ServerSocket类的构造函数之一如下:

public ServerSocket(int port, int backLog, InetAddress bindingAddress);

对于这个构造函数而言,绑定地址必须是java.net.InetAddress 的一个实例。一个简单的办法是通过调用它的静态方法getByName来构造一个InetAddres对象。该方法来一个包含主机名的字符串参数:

InetAddress.getByName("127.0.0.1");

下面一行代码构造一个ServerSocket ,它监听本地机器的8080端口,backlog设置为1。

new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));

一旦有了一个 ServerSocket 实例,可以通过调用accept方法来告诉它等待进来的连接请求。这个方法只有在有一个连接请求时才返回。它返回的是Socket类的实例。这个Socket对象能够发送和接受来自客户端应用的字节流,就是第一节所讲到的socket类。实际上,accept 是本文提及的唯一一个在应用中使用的方法。

Application应用

我们的web服务器应用是ex01.pyrmont包的一部分,包含三个类:

  • HttpServer
  • Request
  • Response

这个应用的入口(静态main方法)是HttpServer类。它创建了一个HttpServer 实例来调用它的await方法。 就象这个方法名所暗示的,await 方法在一个指定的端口等待一个HTTP请求,并处理它们,然后发送回应给客户端。它保持等待状态,直到收到一个shutdown命令。 (命令名await来代替wait的原因是wait是System.Object类中的一个用于线程方面的重要方法)

应用仅仅只发送静态资源,比如来自特定目录的HTML和图片文件。不支持动态包头 (比如日期或者cookie) 。

在下面的段落中,让我们来看看这三个类吧。

HttpServer 类

HttpServer类表示一个web服务器,且在公共静态目录WEB_ROOT及它的子目录中能为找到的那些静态资源而服务。WEB_ROOT用以下方式初始化:

public static final String WEB_ROOT =
 System.getProperty("user.dir") + File.separator  + "webroot";

这段代码指明了一个包含静态资源的webroot目录,这些资源可用来测试该应用。在该目录中也能找到servlet容器。

要请求一个静态资源,在浏览器中输入如下地址或URL:

http://machineName:port/staticResource

machineName 是运行这个应用的计算机名或者IP地址。如果你的浏览器是在同一台机器上,可以使用localhost作为机器名。端口是8080。staticResource是请求的文件夹名,它必须位于WEB-ROOT目录中。

必然,如果你使用同一个计算机来测试应用,你想向HttpServer请求发送一个index.html 文件,那么使用如下URL:

http://localhost:8080/index.html

想要停止服务器,可以通过发送一个shutdown命令。该命令是被HttpServer 类中的静态SHUTDOWN_COMMAND变量所定义:

private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

因此,要停止服务,你可以使用命令:

http://localhost:8080/SHUTDOWN

现在让我们来看看前面提到的await方法。下面一个程序清单给出了解释。

Listing 1.1. The HttpServer class' await method

public void await() {
    ServerSocket serverSocket = null;
    int port = 8080;
    try {
        serverSocket =  new ServerSocket(port, 1,
        InetAddress.getByName("127.0.0.1"));
    }
    catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // Loop waiting for a request
    while (!shutdown) {
        Socket socket = null;
        InputStream input = null;
        OutputStream output = null;
        try {
            socket = serverSocket.accept();
            input = socket.getInputStream();
            output = socket.getOutputStream();

            // create Request object and parse
            Request request = new Request(input);
            request.parse();

            // create Response object
            Response response = new Response(output);
            response.setRequest(request);
            response.sendStaticResource();

            // Close the socket
            socket.close();

            //check if the previous URI is a shutdown command
            shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
        }
        catch (Exception e) {
            e.printStackTrace();
            continue;
        }
    }
}

await方法是通过创建一个ServerSocket实例而开始的。然后它进入了一个WHILE循环:

serverSocket =  new ServerSocket(
     port, 1, InetAddress.getByName("127.0.0.1"));

...

// Loop waiting for a request
while (!shutdown) {
    ...
}
socket = serverSocket.accept();

在收到一个请求后,await方法从accept方法返回的socket实例中获得java.io.InputStream 和java.io.OutputStream对象。

input = socket.getInputStream();
output = socket.getOutputStream();

await于是就创建一个Request对象并调用它的 parse 方法来解析原始的HTTP请求信息。

// create Request object and parse
Request request = new Request(input);
request.parse();

接下来,await 方法创建了一个Response 对象,使用setRequest方法并调用它的sendStaticResource 方法。

// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();

最后,await关闭该Socket。调用Request的getUri方法来检查HTTP请求的URI是否是一个shutdown命令。如果是,shutdown变量被设置为true,程序退出while循环。

// Close the socket
socket.close();
//check if the previous URI is a shutdown command
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);


Request类

Request类代表一个HTTP请求。Socket处理客户端的通讯,将返回一个InputStream对象,通过传递该对象,可以构造一个Request类的实例。通过调用InputStream 对象的read方法来获得这个HTTP请求的原始数据(raw data)。

Request 有两个公共方法:parse 和 getUri。parse方法解释HTTP请求的原始数据。它不做很多事情----它能够利用的唯一信息只是HTTP请求的URI ,这个URI是从私有方法 parseUri.得到的。parseUri 方法保存URI 到uri 变量中,然后调用公共方法getUri来返回一个HTTP请求的URI。

为了理解parse 和 parseUri 方法是如何工作的,需要知道HTTP请求的内部结构。这个结构是在RFC2616文档中定义的。

一个HTTP请求包含三个部分:

  • 请求行(Request line)
  • 请求包头(Headers)
  • 消息体(Message body)

现在,我们仅仅只对HTTP请求的第一部分请求行(Request line)感兴趣。一个请求行由方法标记开始,后面根请求的URI和协议版本,最后由CRLF字符结束。请求行中的元素被空格字符分开。比如,使用GET方法请求的index.html文件的请求行如下:

GET /index.html HTTP/1.1 //这是一个请求行

方法parse从socket的InputStream 中读取整个字节流,该字节流是 Request 对象传递进来的,然后parse将这些字节流存储在一个缓冲区里, 在缓冲区中组装一个称为request的StringBuffer对象。

下面的Listing 1.2.显示了parse方法的用法:

Listing 1.2. The Request class' parse method

public void parse() {
    // Read a set of characters from the socket
    StringBuffer request = new StringBuffer(2048);
    int i;
    byte[] buffer = new byte[2048];

    try {
        i = input.read(buffer);
    }
    catch (IOException e) {
        e.printStackTrace();
        i = -1;
    }

    for (int j=0; j<i; j++) {
        request.append((char) buffer[j]);
    }

    System.out.print(request.toString());
    uri   = parseUri(request.toString());
}

parseUri 方法从请求行那里得到URI。Listing 1.3 展示了parseUri 方法的用途。 parseUri 减缩请求中的第一个和第二个空格来获得URI。

Listing 1.3. The Request class' parseUri method

private String parseUri(String requestString) {
    int index1, index2;
    index1 = requestString.indexOf(' ');

    if (index1 != -1) {
        index2 = requestString.indexOf(' ', index1 + 1);
        if (index2 > index1)
           return requestString.substring(index1 + 1, index2);
    }

    return null;
}
Response类

Response表示一个HTTP响应。它的构造函数接受一个OutputStream对象,比如下面的:

public Response(OutputStream output) {
    this.output = output;
}

Response 对象被HttpServer类的await方法构造,该方法被传递的参数是从socket那里得到的OutputStream对象。

Response类有两个公共方法: setRequest和sendStaticResource. setRequest方法传递一个Request对象给Response对象。Listing 1.4中的代码显示了这个:

Listing 1.4. The Response class' setRequest method

public void setRequest(Request request) {
    this.request = request;
}

sendStaticResource 方法用来发送一个静态资源,比如HTML文件。Listing 1.5给出了它的实现过程:

Listing 1.5. The Response class' sendStaticResource method

public void sendStaticResource() throws IOException {
    byte[] bytes        = new byte[BUFFER_SIZE];
    FileInputStream fis = null;

    try {
        File file  = new File(HttpServer.WEB_ROOT, request.getUri());
        if (file.exists()) {
            fis    = new FileInputStream(file);
            int ch = fis.read(bytes, 0, BUFFER_SIZE);

            while (ch != -1) {
                output.write(bytes, 0, ch);
                ch = fis.read(bytes, 0, BUFFER_SIZE);
            }
        }
        else {
            // file not found
            String errorMessage = "HTTP/1.1 404 File Not Found/r/n" +
                "Content-Type: text/html/r/n" +
                "Content-Length: 23/r/n" +
                "/r/n" +
                "<h1>File Not Found</h1>";
            output.write(errorMessage.getBytes());
        }
    }
    catch (Exception e) {
        // thrown if cannot instantiate a File object
        System.out.println(e.toString() );
    }
    finally {
        if (fis != null)
            fis.close();
    }
}

sendStaticResource 方法是非常简单的。它首先传递父路径和子路径给File类的构造器,从而对java.io.File类进行了实例化。

File file = new File(HttpServer.WEB_ROOT, request.getUri());

然后它检查文件是否存在。如果存在,sendStaticResource 方法通过传递File对象来构造一个java.io.FileInputStream对象。然后调用FileInputStream 的read方法,将字节流写如到OutputStream输出。注意这种情况下, 静态资源的内容也被作为原始数据被发送给了浏览器。

if (file.exists()) {
    fis    = new FileInputStream(file);
    int ch = fis.read(bytes, 0, BUFFER_SIZE);

    while (ch != -1) {
        output.write(bytes, 0, ch);
        ch = fis.read(bytes, 0, BUFFER_SIZE);
    }
}

如果这个文件不存在,sendStaticResource 方法发送一个错误消息给浏览器。

String errorMessage = "HTTP/1.1 404 File Not Found/r/n" +
    "Content-Type: text/html/r/n" +
    "Content-Length: 23/r/n" +
    "/r/n" +
    "<h1>File Not Found</h1>";
output.write(errorMessage.getBytes());

编译和运行应用程序

为了编译和运行应用,你首先需要解压包含本文应用程序的.zip文件。你解压的目录成为工作目录(working directory),它有三个子目录: src/, classes/, 和 lib/。 要编译应用程序需要在工作目录输入如下语句:

javac -d . src/ex01/pyrmont/*.java

这个-d 选项参数将结果写到当前目录,而不是src/ 目录。

要运行应用程序,在工作目录中输入如下语句:

java ex01.pyrmont.HttpServer

要测试你的应用程序,打开浏览器,在地址栏中输入如下URL:

http://localhost:8080/index.html

你将可以看到浏览器中显示的index.html 页面,如Figure 1所示。

output from the web server
Figure 1. The output from the web server

在控制台(Console),你能看到如下内容:

GET /index.html HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 
Host: localhost:8080
Connection: Keep-Alive

GET /images/logo.gif HTTP/1.1
Accept: */*
Referer: http://localhost:8080/index.html
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 
Host: localhost:8080
Connection: Keep-Alive

 

概要总结

在本文中,你了解了一个简单的WEB服务器的工作机制。本文附带的应用程序源代码只包含三个类,但并不是所有的都有用。尽管如此,它还是能被作为一种很好的学习工具为我们服务。


Translated by Willpower,2003.11.24

深入学习Java Web服务器源码 Java Web服务器是基于Java技术构建的,能够处理HTTP请求并返回HTML页面的应用程序。它广泛用于构建动态网站和Web应用程序。要深入理解Java Web服务器,我们必须探索其源码,了解请求的处理流程,以及如何将Java代码与HTTP协议相互转化。以Tomcat为例,它是Apache软件基金会的一个开源Java Web服务器。在Tomcat的源码中,包包含了服务器的核心类和接口。Server类是整个Tomcat服务器的入口,负责整体启动和关闭;而Connector。 阅读详情

相关推荐

深入解析Tomcat工作机制:StandardContext组件详解

本文还有配套的精品资源,点击获取 简介:Web服务器是互联网上运行Web应用的基础,Apache Tomcat是广泛使用的Java Servlet容器。本文将深入探讨Tomcat的核心组件StandardContext,包括其对Web应用的管理、类加载器、session配置、过滤器链、Servlet和JSP处理、错误处理以及性能优化等。了解StandardContext的工...

weixin_29443363的博客 1174

JavaWeb是什么?总结一下JavaWeb的体系

JavaWeb是什么?通过最近在尚硅谷上学习,分享一下Java WEB前言JavaWeb的技术体系登录页面的开发涉及的技术知识点HTML是什么?登录功能实现-环境的搭建涉及的技术知识点Web服务器Tomcat服务器的安装及配置在eclipse中配置tomcat创建动态的web工程登录功能实现-LoginServletServlet在web.xml中的配置获取请求参数值响应结果具体登录功能的实现步骤...

qq_41911570的博客 19万+

Java Web Start技术详解与实战入门

Java Web Start(简称 JWS)是一项基于标准 HTTP 协议的 Java 应用部署技术,旨在实现“一次编写,随处运行”的跨平台交付能力。通过浏览器或直接调用.jnlp文件,JWS 能够自动从服务器下载 Java 应用程序,并在本地 JVM 中安全运行,无需用户手动安装或配置复杂的依赖环境。其核心架构依赖于 JNLP(Java Network Launch Protocol)协议,结合本地缓存、安全沙箱和自动版本更新机制,显著降低了传统桌面应用部署的复杂性。JWS 通过。

weixin_42146230的博客 980

JavaWeb介绍

Web开发是为Internet(World Wide Web)或Intranet(私有网络)开发网站所涉及的工作。Web开发的范围可以从开发简单的纯文本单个静态页面到复杂的基于Web的Internet应用程序(Web应用程序)。 静态web:动态web:可以读取一些服务器存在的数据,例如: 缺点页面会动态展示:web的页面展示效果因人而异。 缺点优点微软:国内最早流行的就是ASP 在HTML中嵌入VB的脚本,ASP+COM优点缺点优点缺点B/S:浏览器和服务器 C/S:客户端和服务器 sun公司主推的B

希望有点用 2万+

C/C++ 计算程序运行的时间

C/C++计算程序执行时间的方法,精度依次增加,推荐度也依次增加 1.#include <time.h> clock_t start, finish; double process_interval ; start=clock(); process(); //要计时的程序 finish=clock(); process_interval =(double)(finish-star...

stu_shanghui的博客 1020

彻底清理Easy Connect残留:从服务到驱动的完整卸载指南

在企业网络接入场景中,远程客户端常因内核驱动、系统服务和网络过滤组件导致卸载残留,进程无法结束、文件被锁定、注册表项顽固存在。其原理在于驱动挂载网络协议栈,服务守护进程,卸载时资源占用导致清理不彻底。彻底清理的技术价值在于恢复系统纯净、避免网络异常和软件冲突。典型应用场景包括企业办公机、个人笔记本更换或重装客户端。本文针对深信服Easy Connect,提供从停止服务、删除驱动到清理注册表和虚拟网卡的分步操作链路,并给出验证方法和避坑经验。

weixin_31292729的博客 237

JavaWeb

JavaWeb是指用Java技术来解决Web互联网领域的技术栈。Web客户端和Web服务端两部分Web开发:Web(World Wide Web),即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面静态WebHTML、CSS早些年,提供给所有人观看的数据始终不会发生变化!动态web现在,几乎所有的网站都是动态Web的。

记录学习历程 7684

将一维数据(序列)转化为二维数据(图像)的方法汇总GAFS, MTF, Recurrence plot,STFT

虽然深度学习方法(1D CNN, RNN, LSTM 等)可以直接处理一维数据,但是当前的深度学习方法主要还是处理二维结构数据的,特别是在计算机视觉CV以及自然语言处理NLP领域,各种各样的方法层出不穷。因此,如果能够将一维序列数据转化为二维(图像)数据, 则可以直接结合CV以及NLP领域的方法,是不是很有趣! GAF, GASF, GADF, MTF, Recurrence Plot, STFT, 短时傅里叶变换

MasterQKK 5万+

Java Web(入门)

Java Web开发是指使用Java技术来创建动态网站或Web应用程序。Java Web开发主要使用Servlet、JSP(JavaServer Pages)、JavaBeans等技术来实现动态页面和处理业务逻辑。通过实际项目实践来巩固所学知识,在学习过程中,要注重理论与实践相结合,多动手编写代码,解决实际问题,逐步提高自己的编程能力。

2303_76624483的博客 6180

神联动:LSTM+卡尔曼滤波!一区大门轻松开!

近来热度飙升,成为时间序列预测和状态估计等领域的香饽饽,非常好发高区!主要在于:这两者结合,不仅能提高模型预测准确性;还能拓展应用场景,为我们的论文创新提供发挥空间,且当下还在蓝海阶段,还不算卷。具体点说:卡尔曼滤波擅长处理线性状态估计和噪声,能使LSTM更好地适应动态环境的变化,减少噪声干扰,降低预测误差。而LSTM通过捕捉长期依赖关系,擅长处理非线性时间序列,能够弥补卡尔曼滤波在这方面的不足,从而把应用场景从传统的状态估计,延伸到金融预测、工业检测、自动驾驶等任务。

2401_82426425的博客 2208

从无人机到机械臂:深入聊聊LQR和LQG在实际项目里的那些‘坑’与最佳实践

本文深入探讨了LQR和LQG在无人机和机械臂等实际项目中的应用挑战与最佳实践。从系统建模的妥协艺术到调参的系统化方法,再到离散化的细节处理,文章分享了工程实践中的宝贵经验。特别强调了如何应对传感器噪声、未建模动态等现实问题,并提供了实用的调试工具和诊断流程,帮助工程师避免常见陷阱,提升控制系统的稳定性和性能。

weixin_28683391的博客 386

基于JAVA的WEB服务器工作机制(1)

基于JAVA的WEB服务器工作机制(1)一个WEB服务器也被称为一个HTTP服务器,因为它使用HTTP协议和它的客户进行通讯,而这些客户通常是浏览器。 一个基于JAVA的WEB服务器使用了两个重要的类:java.net.Socket和java.net.ServerSocket,并且是通过HTTP消息进行通讯的。本文开头将讨论HTTP和这两个类,后面,将解释一个简单WEB服务器应用程序的工作机制

Willpower's Java Zone 1428

QGIS安装与使用教程

QGIS安装与使用教程

weixin_46713695的博客 2万+

基于JAVA的WEB服务器工作机制(2)

ServerSocket 类Socket 类表示的是客户端的socket。无论什么时候,只要你想连接到一个远程服务器的应用,你都要构建一个socket。如果你想执行一个服务器应用程序,比如HTTP服务或者FTP服务的程序,那么你需要使用不同的途径。因为你的服务器必须一直是开机闲置,所以它不知道什么时候客户机试图来连接它。这个时候,需要使用java.net.ServerSocket 类。它会

Willpower's Java Zone 1296

Vue3 - 详细实现流程图编辑器可视化平台示例代码,打造前端web网页流程图在线编辑绘制操作展示,vue3自定义绘制流程图在页面上画流程图功能(提供各种操作按钮及节点控件,界面美观交互式流程图插件)

vue3,绘制流程图,在线流程图制作,在vue3中实现流程图,vue3做一个制作流程图的功能,vue3流程图组件,vue3流程图,流程图绘制展示,vue3流程图可视化在线编辑源码,基于VUE3的在线绘制流程图工具,vue3+logicflow流程图,绘制动态流程图并自定义节点和线,vue使用logicFlow绘制流程图,生成各种流程图图形可连接点移除,基于Vue的流程图组件,工作流程图,流程编辑器,vue3流程组件,vue-flow绘制流程图,绘制流程图示例demo,vue3 logicflow流程图使用教

🏆 前端领域优质创作者 9967

LVGL core theme主题管理(lv_theme.c)

如果打开宏,主题的初始化是在显示设备注册时完成的。整个themes的实现放在目录下面。这里一共有三套主题(basic、default和mono)可供选择或者参考。源码中默认对接的是 default 主题,所以在中,看到的是调用default主题的接口。也就是说,如果需要更换主题,把这里面的接口换掉就可以了。或者要重新做一套主题,参考这些实现修改也就可以了。虽说有三套主题,但逻辑流程是一样的。主要完成两个工作:构造lv_theme_t结构体和初始化默认样多备用(style_init函数内实现)。构造。....

Bigan(安)的博客 3411

基于JAVA的WEB服务器工作机制(3)完

Request类Request类代表一个HTTP请求。Socket处理客户端的通讯,将返回一个InputStream对象,通过传递该对象,可以构造一个Request类的实例。通过调用InputStream 对象的read方法来获得这个HTTP请求的原始数据(raw data)。Request 有两个公共方法:parse 和 getUri。parse方法解释HTTP请求的原始数据。它不做很多

Willpower's Java Zone 1341

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

web服务器简介

当客户端发送http请求后,web程序接收并处理请求,web程序服务器处理http协议请求报文并进行响应的过程可以使用java代码实现,如下是一个代码示例(不需要执行,简单了解即可,其原理是Servlet技术)

wgqjr的博客 819

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java web 学习笔记 (1)_web服务器原理(网络程序)

**##web服务器原理** 我们现在每天浏览网页,浏览器向服务器发送请求,服务器中的web服务器来处理来 至全世界各地的请求信息。web服务器是怎样处理请求并返回文档信息?,web服务器的 基本原理是怎样的呢?我们可以这样分析,web服务器是用来处理请求信息,返回服务器 信息资源。处理信息,返回信息。这不就是程序的功能吗? 没错web服务器就是许多网络程序的集合,下面用一个网络程...

ak_csdno的博客 279

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JAVA编写的简单WEB SERVER

本文章可以帮助理解WEB SERVER的实现原理,进一步理解HTTTP协议工作机制。附JAVA源代码。 https://download.youkuaiyun.com/download/u011329961/10907186

u011329961的博客 264

Java实习模拟面试之WAS:Web应用服务器核心原理与选型解析

在Java Web开发领域,WAS(Web Application Server,Web应用服务器)是承载和运行Web应用程序的核心基础设施。对于Java后端开发实习生而言,理解WAS的基本原理、核心功能以及主流产品的差异,是构建扎实技术基础的关键一步。本篇博客通过模拟面试对话的形式,带你深入探讨WAS的核心概念、工作原理、关键组件以及在实际项目中的选型考量,助你在面试中展现对系统底层运行机制的理解。好的面试官。WAS(Web Application Server)是一种。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 908

JAVA--双亲委派机制

双亲委派机制(Parents Delegation Model)是JVM中类加载器的一种工作机制。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己去加载。这种机制确保了Java核心API的类不会被随意替换,维护了Java运行环境的安全性和稳定性。作用:用户根据需要自定义的类加载器父类加载器:通常是应用程序类加载器// 查看类加载器层级结构的示例代码// 获取当前类的类加载器。

m0_74168976的博客 2129

Servlet学习之web服务器Tomcat 详解

Web服务器是什么 Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)进行信息交流,这就是人们常把它们称为HTTPD服务器的原因。 Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础...

weixin_30457881的博客 76
上一篇: WEB应用中的基本身份验证和表单身份验证
下一篇: 彻底明白Java的IO系统
皮鲁
博客等级 码龄23年 44粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值