Socket socket = new Socket ( "yahoo.com", 80);
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 thr out console
System.out.println(sb.toString());
socket.close();

空行用于分割 POST 方法的请求体。request.parse() 根据这个格式解析,获得 URI (第一行第一个空格后的字符串)等。

java.net.Socket 类表示一个客户端套接字,即当客户端主动想要连接到远程服务器应用程序时创建的套接字。

但是如果想要实现一个服务器应用程序,它并不知道客户端应用程序会在什么时候发起连接,因此必须时刻待命。需要使用服务器套接字 java.net.ServerSocket,服务器套接字等待来自客户端的连接请求,当服务器套接字接收到了连接请求后,它会创建一个 Soket 实例来处理与客户端的通信。


ServerSocket serverSocket = new ServerSocket(8080, 2, InetAddress.getByName("yahoo.com"));
Socket socket = serverSocket.accept();
InputStream input = socket.getInputStream();
OutputStream out = socket.getOutStream();
// 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();

第二个参数 backlog 表示,在服务器拒绝接收传入的请求之前,传入的连接请求的最大队列长度。

ServerSocket 类的 accept 方法:

创建了 ServerSocket 实例后,可以使其等待传入的连接请求,只有当接收到连接请求后,该方法才会返回,其返回值时一个 Socket 实例,然后使用该 Socket 对象与客户端进行字节流的发送/接收。

javax.servlet.servlet 接口最为重要,所有的 servlet 程序都必须实现该接口,或继承实现了该接口的类。在该接口声明的5个方法中,init() service() destroy() 方法是与 servlet 生命周期相关的方法。在init() 中编写仅需执行一次的初始化代码,一般情况下,init() 方法可以留空。在 servlet 对象的整个生命周期内,service() 方法会被多次调用。一般当 servlet 容器关闭或 servlet 容器要释放内存,而且只有当servlet 实例中的 service() 方法中的所有线程都退出或执行超时后,才会调用 destroy() 方法。

service 的入参也要分别实现 javax.servlet.ServletRequest 接口和 javax.servlet.ServletResponse 接口,或继承实现了它们的类。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
// package javax.servlet; import java.io.IOException; public interface Servlet {
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
}

一个功能齐全的 servlet 容器有以下事即将要做:

    • 当第一次调用某个 servlet 时,哟啊载入该 servlet 类,并调用其 init() 方法(仅此一次);
    • 针对每个 request 请求,创建一个 javax.servlet.ServletRequest 实例和一个 javax.servlet.ServletResponse 实例;
    • 调用该 servlet 的 service() 方法,将 ServletRequest 对象和 ServletResponse 对象作为参数传入;
    • 当关闭该 servlet 类时,调用其 destroy() 方法,并卸载该 servlet 类。

tomcat 1 - Servlet 容器的更多相关文章

  1. tomcat(5)servlet容器

    [0]README 0.0)本文部分文字描写叙述转自:"深入剖析tomcat",旨在学习 tomcat(5)servlet容器 的基础知识. 0.1)intro to servle ...

  2. JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系

    JSP(JAVA SERVER PAGE)的缩写,其本身就是servlet的简化,是一种动态网页标准,其特点是在HTML代码中嵌入JAVA代码,JSP标签或用户标签来生成网页.至于它为什么会出现,主要 ...

  3. How tomcat works(深入剖析tomcat)servlet容器

    How tomcat works (5)servlet容器阅读笔记 第四章阅读了tomcat默认连接器的实现,当时connector中的使用的容器是自定义的容器,也是非常之简单奥,一个人就干完了所有的 ...

  4. tomcat和servlet容器的关系

  5. Web服务器(Apache)与Servlet容器(Tomcat)

    之前一直比较迷惑Apache与Tomcat的关系,通过查询资料,有所了解,现记录于此. Apache与Tomcat 两者定位:Apache是HTTP Web服务器,Tomcat是Web容器. 有一个非 ...

  6. SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)

    Spring Boot默认使用Tomcat作为嵌入式的Servlet容器,只要引入了spring-boot-start-web依赖,则默认是用Tomcat作为Servlet容器: <depend ...

  7. web服务器、tomcat、servlet是什么?它们之间的关系又是什么?

    今天偶然看到常见web服务器的介绍有Apache HTTP server.Nginx.Microsoft IIS.GWS,心中不禁产生了疑问,这些都是什么呢?一直认为tomcat就是web服务器,以下 ...

  8. 尚硅谷springboot学习25-嵌入式Servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器:

  9. 19. SpringBoot_web开发-使用外部Servlet容器&JSP支持

    還沒有web.xml,生  配置tomcat 嵌入式Servlet容器:应用打成可执行的jar 优点:简单.便携: 缺点:默认不支持JSP.优化定制比较复杂 使用定制器[ServerPropertie ...

  10. tomcat和servlet的关系

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

随机推荐

  1. VS2010 发布网站总是连同cs文件一起发布了

    选择第一个,保存再发布.cs文件 都删除了.

  2. xxl-job调度任务简单使用

    简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. https://www.cnblogs.com/x ...

  3. function 和mapped function的区别

    1 --在函数定义上使用mapped前缀将此函数标记为自动映射到集合上.这意味着,如果将集合作为函数的第一个参数,则该函数将在集合的元素上自动重复调用.这允许您定义脚本化函数,这些函数的行为方式与映射 ...

  4. 通过java代码向mysql数据库插入记录,中文乱码处理

    处理步骤 修改mysql配置文件,并重启mysql服务.mysql默认配置文件路径为/etc/my.cnf. 修改配置如下: [mysqld] character-set-server=utf8 [c ...

  5. PYTHON中的CONCURRENT.FUTURES模块

    一 : 概述 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异 ...

  6. 记一次修改dotnet-cnblogs图片路径的正则匹配规则

    大佬的GitHub 前言   因为最近一时心血来潮,学了markdown,我觉得但凡是个人,对于不用word或html就可以有不错的排版,而且使用起来简单便捷,都会投向markdown的怀抱中的.又因 ...

  7. scrollIntoView()方法将元素滚动到浏览器窗口的可见区域

    TIPS:容器可滚动时才有用! 语法 element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoVi ...

  8. 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件

    目录 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件 昨日内容回顾 今日内容概要 今日内容详细 0 导出项目依赖 0 学长问题解析 1 前台主页功能 ...

  9. You are using pip version 8.1.2, however version 23.0 is available.You should consider upgrading via the 'pip install --upgrade pip' command.

    今天使用python2安装es模块时报错: 原因是pip(模块管理工具)版本过低,需先升级pip,再进行安装 先替换pip的镜像,默认镜像拉取慢,还可能会失败 cd ~;mkdir .pip;touc ...

  10. 使用go自定义生成项目LISENSE(授权协议)

    需要使用一个使用go开发的工具,叫license,在Windows下安装这个工具,请确保你使用的go sdk是1.16以上的版本,然后执行下面的命令: go install github.com/ni ...