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

[经验分享] how tomcat works- implemention of a simple Server

[复制链接]

尚未签到

发表于 2017-2-8 06:48:44 | 显示全部楼层 |阅读模式
1. 服务器类
建立ServerSoke,作为request和response的中枢

  • package ex01.pyrmont;   
  •   
  • import java.net.Socket;   
  • import java.net.ServerSocket;   
  • import java.net.InetAddress;   
  • import java.io.InputStream;   
  • import java.io.OutputStream;   
  • import java.io.IOException;   
  • import java.io.File;   
  •   
  • public class HttpServer {   
  •   
  •   /** WEB_ROOT is the directory where our HTML and other files reside.  
  •    *  For this package, WEB_ROOT is the "webroot" directory under the working  
  •    *  directory.  
  •    *  The working directory is the location in the file system  
  •    *  from where the java command was invoked.  
  •    */  
  •   public static final String WEB_ROOT =   
  •     System.getProperty("user.dir") + File.separator  + "webroot";   
  •   
  •   // shutdown command   
  •   private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";   
  •   
  •   // the shutdown command received   
  •   private boolean shutdown = false;   
  •   
  •   public static void main(String[] args) {   
  •     HttpServer server = new HttpServer();   
  •     server.await();   
  •   }   
  •   
  •   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;   
  •       }   
  •     }   
  •   }   
  • }   


2. 处理请求的类

  • package ex01.pyrmont;   
  •   
  • import java.io.InputStream;   
  • import java.io.IOException;   
  •   
  • public class Request {   
  •   
  •   private InputStream input;   
  •   private String uri;   
  •   
  •   public Request(InputStream input) {   
  •     this.input = input;   
  •   }   
  •   
  •   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());   
  •   }   
  •   
  •   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;   
  •   }   
  •   
  •   public String getUri() {   
  •     return uri;   
  •   }   
  •   
  • }  


3. 处理响应的类

  • package ex01.pyrmont;   
  •   
  • import java.io.OutputStream;   
  • import java.io.IOException;   
  • import java.io.FileInputStream;   
  • import java.io.File;   
  •   
  • /*  
  •   HTTP Response = Status-Line  
  •     *(( general-header | response-header | entity-header ) CRLF)  
  •     CRLF  
  •     [ message-body ]  
  •     Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF  
  • */  
  •   
  • public class Response {   
  •   
  •   private static final int BUFFER_SIZE = 1024;   
  •   Request request;   
  •   OutputStream output;   
  •   
  •   public Response(OutputStream output) {   
  •     this.output = output;   
  •   }   
  •   
  •   public void setRequest(Request request) {   
  •     this.request = request;   
  •   }   
  •   
  •   public void sendStaticResource() throws IOException {   
  •     byte[] bytes = new byte[BUFFER_SIZE];   
  •     FileInputStream fis = null;   
  •     try {   
  •       File file = new File(HttpServer.WEB_ROOT, request.getUri());   
  •       //System.out.print("+++++++++++++++"+request.getUri());   
  •       String tt=request.getUri();   
  •      byte[] xx=new byte[30];   
  •       xx=tt.getBytes();   
  •      output.write(xx,0,xx.length);   
  •       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 Foundererewrwerwer</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();   
  •     }   
  •   }   
  • }  


4. 输出结果
访问地址:http://localhost:8080/index.html

  • GET /index.html HTTP/1.1   
  • Accept: */*   
  • Accept-Language: zh-cn   
  • UA-CPU: x86   
  • Accept-Encoding: gzip, deflate   
  • User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler ; .NET CLR 2.0.50727)   
  • Host: localhost:8080   
  • Connection: Keep-Alive  


5. 总结
这样我们就实现了一个简单的服务器,不过这里智能处理静态页面,动态页面的处理待续。。。。

运维网声明 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-338932-1-1.html 上篇帖子: 装了2个tomcat遇到的问题 下篇帖子: JBossAS性能调优和瘦身系列(3):Tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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