设为首页 收藏本站
查看: 471|回复: 0

[经验分享] 浅析Tomcat(一)

[复制链接]

尚未签到

发表于 2017-1-18 11:11:31 | 显示全部楼层 |阅读模式
想必大家都知道Tomcat其实就是servlet容器。负责servlet前期的准备工作。在这里简单用代码模拟一下Tomcat的工作。
首先牵涉到网络,那么网络编程是少不了的。
1.这个类就是一个servlet服务的工具,程序从这里开始
package com.arz.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServletServer {
private ServerSocket serverSocket;
private int port;
private boolean shutDown;
public ServletServer (int port){
this.port = port;
}
public void startServer(){
try{
serverSocket = new ServerSocket(port);
}catch(IOException e){
System.out.println("监听"+port+"失败!");
System.exit(0);
}
while(!shutDown){
try{
//监听着8080端口
Socket socket = serverSocket.accept();
//实例一个Runnable接口类,在这里面运行全部的核心工作
DispatchSocket dispatchSocket = new DispatchSocket(socket);
//启动Runnable中的run()方法
new Thread(dispatchSocket).start();
}catch(IOException e){
System.out.println("客户端出了问题");
e.printStackTrace();
}
}
}
public static void main(String[] args){
ServletServer server = new ServletServer(8080);
server.startServer();
}
public boolean isShutDown(){
return shutDown;
}
public void setShutDown(boolean shutDown){
this.shutDown = shutDown;
}
}

2.创建DispatchSocket这个类是为了满足Tomcat的多线程而产生的。有了这个类“Tomcat”就可以同时被多个访问了
package com.arz.server;
import java.io.IOException;
import java.net.Socket;
import com.arz.servlet.Servlet;
import com.arz.servlet.ServletMapping;
import com.arz.servlet.TestServlet;
import com.arz.servlet.WebApp;
public class DispatchSocket implements Runnable {
private Socket socket;
public DispatchSocket(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try{
System.out.println("客户端是:"+socket.getRemoteSocketAddress());
//实例request,可以跟踪查看Request类,将socket类的输入流交给request。可以看做是HttpServletRequest
Request request = new Request(socket.getInputStream(),8080);
//实例response,可以跟踪查看Response类,将socket类的输出流交给response。结果将会输出到网页。可以看做是HttpServletResponse
Response response = new Response(socket.getOutputStream());
//*****************这里是直接运行Servlet类的service方法*****************
//将这个类看做是HttpServlet
Servlet servlet = new TestServlet();
//调用我们写的service()方法
servlet.service(request, response);
//*****************这里是我们解析web.xml得到的servlet对象,和上面是并行的*****************
//解析web.xml的类,并且将对象的对应关系包装好
WebApp webApp = WebApp.getWebApp();
String urlPattern = request.getUrlPattern();
ServletMapping mapping = webApp.getServletMappings().get(urlPattern);
if(mapping != null){
String servletName = mapping.getServletName();
Servlet servlet1 = webApp.getServletContext().getServlet(servletName);
if(servlet1 != null){
servlet1.service(request, response);
}else{
response.println("没有获得Servlet");
}
}else{
response.print("你请求的url错误,该url不正确。没有找到相应的页面!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
closeSocket(socket);
}
}
public void closeSocket(Socket socket){
if(socket != null){
try{
socket.getOutputStream().flush();
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}

3.大家应该知道java在servlet编程中只是提供了类的接口,具体的实现是交给服务商完成的。作为比较优秀的服务器Tomcat自然也要实现java定义的servlet类例如HttpServletRequest,下面是HttpServletRequest的模拟代码。当然真正的HttpServletRequest要复杂的多的多
package com.arz.server;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Request {
private int port;
private String host;
private String urlPattern;
private Map<String,String> map = new HashMap<String,String>();
private String method;
private String headInfo;
private InputStream inStream;
protected Request(InputStream inStream,int port) {
this.inStream = inStream;
this.port = port;
parseRequestHead();
}
private void parseRequestHead(){
byte[] buf = new byte[1024];
try{
inStream.read(buf);
headInfo = new String(buf);
System.out.println(headInfo);
method = headInfo.substring(0,headInfo.indexOf("/")).trim();
System.out.println("请求方式:"+method);
host = headInfo.substring(headInfo.indexOf("Host:")+5,headInfo.indexOf(":"+port)).trim();
System.out.println("请求地址:"+host);
//??
if(method.equalsIgnoreCase("get")){
parseGetString();
}else if (method.equalsIgnoreCase("post")){
parsePostString();
}
}catch(IOException e){
e.printStackTrace();
}
}
private void parsePostString(){
urlPattern = headInfo.substring(5, headInfo.indexOf("HTTP/")).trim();
String dataString = headInfo.substring(headInfo.lastIndexOf("\r\n")).trim();
//??
StringTokenizer st = new StringTokenizer(dataString,"&");
while(st.hasMoreTokens()){
String[] ss = st.nextToken().split("=");
map.put(ss[0], ss[1]);
}
}
private void parseGetString(){
String url = headInfo.substring(4, headInfo.indexOf("HTTP/"));
if(url.indexOf("?")==-1){
urlPattern = url.trim();
}else{
urlPattern = url.substring(0, url.indexOf("?")).trim();
String dataString = url.substring(url.indexOf("?")+1).trim();
StringTokenizer st = new StringTokenizer(dataString,"&");
while(st.hasMoreTokens()){
String[] ss = st.nextToken().split("=");
map.put(ss[0], ss[1]);
}
}
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getHeadInfo() {
return headInfo;
}
public void setHeadInfo(String headInfo) {
this.headInfo = headInfo;
}
public String getParameter(String name){
if(map != null && map.size() > 0){
return (String)map.get(name);
}
return null;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-330184-1-1.html 上篇帖子: tomcat原理(转) 下篇帖子: 浅析Tomcat(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表