自己如何实现简单的http服务器

原创 2003年04月30日 16:10:00

文件名:MyHttpServerTest.java

import java.io.* ;
import java.net.* ;
import java.util.* ;

/**
 * main
 */
public class MyHttpServerTest{

 String m_szServerName;//server name
 String m_szVersion;//server version
 int m_nServerPort;//port
 
 public MyHttpServerTest(String szServerName,String szVersion,int nServerPort){
  this.m_szServerName =szServerName;
  this.m_szVersion =szVersion;
  this.m_nServerPort=nServerPort;
 }
 
 /**
  * show version information
  */
 public void showServerInformation(){
  System.out.println("欢迎使用Newman的HTTP服务器!");
  System.out.println("Server Name   : "+this.m_szServerName);
  System.out.println("Server Version: "+this.m_szVersion  );
 }
 
 public void start (){
  this.showServerInformation();

  try{
   ServerSocket server=new ServerSocket(this.m_nServerPort );
   while(true){
    Socket client=server.accept();
    (new HttpClientThread(client)).run();
   }
  }
  catch(Exception e){
   e.printStackTrace();
      System.exit(1);
  }
 
 }
 
 public static void main(String args[]){
  MyHttpServerTest server=new MyHttpServerTest("MyHttpServerTest","1.0",80);
  server.start();   
 } 
}

class HttpClientThread implements Runnable {
 Socket m_sClient;
 HTTPRequest m_Request;
 
 HttpClientThread(Socket sClient)throws IOException{
  this.m_sClient =sClient;
  this.m_Request =new HTTPRequest(this.m_sClient );
 }
 
 public void run(){
  try{
   System.out.println(this.getConnectInfo());
   BufferedOutputStream out=new BufferedOutputStream(this.m_sClient .getOutputStream ());   
   System.out.println( this.m_Request.getLog());

   if(this.m_Request.isGetRequest())
    this.processGetRequest(this.m_Request,out);
   System.out.println("Request completed. Closing connection.");
   this.m_sClient .close ();   
  }
  catch(IOException e){
   System.out.println("IOException occurred .");
      e.printStackTrace();
  }  
 }

 /**
  * get Connect Info
  */
 public String getConnectInfo(){
  String szClientHostName=this.m_sClient .getInetAddress().getHostName ();
  String szClientAddress=this.m_sClient .getInetAddress ().getHostAddress();
  int ClientPort=this.m_sClient .getPort ();
  String szRet="";
  szRet="Accepted connection from "+szClientHostName+"("+szClientAddress+") "+"on port "+ClientPort+".";
  return szRet;
 }

 void processGetRequest(HTTPRequest request,BufferedOutputStream out)throws IOException {
  String szFileName=request.getFileName ();
  File file=new File (szFileName);
  
  if(file.exists ())
   this.sendFile (out,file);
  else{//文件不存在时
   
   System.out.println ("File "+file.getCanonicalPath()+" does not exist.");   
   String notfound="<html><head><title>Not Found</title></head><body><h1>"+
       "Error 404-file not found</h1><p>"+
       "File Name: "+file+" not found"+"<br>"+
       "<a href=index.htm>Return Index</a>"+
       "</body></html>";    

   file://out.write(new String("HTTP/1.0 404 no found").getBytes ());
   out.write (new String ("HTTP/1.0 200 OK/r/n").getBytes ());
   out.write(new String("Content_Length:"+notfound.length()+2).getBytes());
   out.write(new String("Content_Type:text/html/r/n/r/n").getBytes ());    
   out.write(new String(" ").getBytes());
   out.write(notfound.getBytes ());
   out.flush();
  }
 }
 
 void sendFile(BufferedOutputStream out,File file){
  try{
   DataInputStream din=new DataInputStream (new FileInputStream (file ));
   int len=(int)file.length();
   byte buffer[]=new byte [len];
   din.readFully (buffer);
   din.close();
   out.write (new String ("HTTP/1.0 200 OK/r/n").getBytes ());
   out.write (new String ("Content-Length:  "+buffer.length +"/r/n").getBytes ());
   out.write (new String ("Content-Type: text/html/r/n/r/n").getBytes ());
   out.write (buffer);
   out.flush ();
   out.close ();
   System.out.println("File sent: "+file.getCanonicalPath());   
   System.out.println("Number of bytes: "+len);
  }
  catch(Exception e){
   try{
       out.write(("HTTP/1.0 400 " + "No can do" + "/r/n").getBytes());
       out.write("Content-Type: text/html/r/n/r/n".getBytes());
      }
      catch(IOException ioe){
       System.out.println("Error retrieving "+file);
   }  
  }
 }
}

 Vector m_vLines=new Vector ();
 Socket m_sClient;
 HttpInputStream m_In;
 
 HTTPRequest(Socket client)throws IOException{
  this.m_sClient =client;
  this.m_In =new HttpInputStream(this.m_sClient.getInputStream());
  this.getRequest ();
 }

 public String getLog(){
  StringBuffer szRet=new StringBuffer() ;
  szRet.append ("Received the following request:"+"/n");
  
  Enumeration enum=m_vLines.elements ();
  String szstr1="";
  while(enum.hasMoreElements()){
   szstr1=(String)enum.nextElement();
   szRet.append (szstr1+"/n");
  }
  return szstr1.toString();
 }
 
 boolean isGetRequest() {
  if(this.m_vLines .size ()>0){
   String firstline=(String)this.m_vLines.elementAt (0);
   if(firstline.length ()>0)
    if(firstline.substring(0,3).equalsIgnoreCase ("GET"))
     return true;
  }
  return false; 
 }
 
 String getFileName() {
  if(this.m_vLines .size ()>0){
   String firstline=(String)this.m_vLines.elementAt (0);
   String filename=firstline.substring (firstline.indexOf (" ")+1);
   int n=filename.indexOf (" ");
   
   if(n!=-1)
    filename=filename.substring (0,n);
   
   try{
    if(filename.charAt(0)=='/' )
     filename=filename.substring (1);
   }
   catch(StringIndexOutOfBoundsException ex){
   }
   
   if(filename.equals (""))
    filename="index.htm";
   if(filename.charAt (filename.length ()-1)=='/')
    filename+="index.htm";//not understand
   return filename;
  }
  else
   return "";
 }
 
 public HttpInputStream getInputStream(){
  return this.m_In ; 
 }
 
 public HTTPRequest getRequest() throws IOException {    
  String line;
  while(true){
   line=this.m_In.readLine ();      
   
   if(line.length ()>0)
    this.m_In.addLine(line);
   else
    break;
  }
  return this;
 }
 
 
/**
 * only use to recognize methed "get"
 */
class HttpInputStream extends FilterInputStream {
 HttpInputStream(InputStream in){
  super(in);
 }
 
 public void addLine(String line) {
  m_vLines .addElement(line);
 }
 
 public String readLine() throws IOException {
  StringBuffer result=new StringBuffer ();       
  boolean finished=false;
  boolean isenter=false;
 
  while(!finished){
   int ch=-1;
   ch=read();   
   
   if((isenter)&&(ch==10)){// if it is "/n/r"
    result.setLength(result.length()-1);//had added "/n",remove it
    return result.toString ();
   }
   
   if(ch==13)//if enter pressed
    isenter=true;
   else
    isenter=false;

   if(ch==-1)//end
    return result.toString ();
   else
    result.append ((char)ch);   
  }
  return result.toString ();
 } 
}
}

请多指教

一个简单的http服务器的实现 含源代码

EasyHttp 最简单的C语言 http服务器说明:这是一个C语言编写的http服务器简单实现,使用python语言作为cgi程序处理用户的表单输入。通过这个项目有利于理解http服务流程,以及多线...
  • hunterzhaominng
  • hunterzhaominng
  • 2016年04月12日 19:29
  • 1158

java造轮子之自己写简单的HTTP服务器

大概介绍一下原理吧,浏览器打开网页可以简单分为3个阶段: 1.通过socket向服务器发送一个符合一定格式的请求字符串(里面包含了用户输入的网址),比如: Acce...
  • A1023824314
  • A1023824314
  • 2016年07月20日 23:38
  • 1482

利用http协议实现一个简单的web服务器

目录文件: htdoc: html文件: hello hello fucang ...
  • fucangzxx
  • fucangzxx
  • 2016年08月06日 10:27
  • 1921

编写一个简易的 HTTP 服务器程序

转载:http://blog.jobbole.com/107279/#article-comment 好久没输出了,知识还是要写下总结才能让思路更加清晰。最近在学习计算机网络相关的知识,来聊...
  • u012662731
  • u012662731
  • 2016年11月03日 20:05
  • 2056

自己动手写http服务器---java版

最简单的http服务器,可下载源码:http://download.csdn.net/detail/ajaxhu/6356885 大概介绍一下原理吧,浏览器打开网页可以简单分为3个阶段: 1.通...
  • AJAXHu
  • AJAXHu
  • 2013年10月05日 17:52
  • 9935

实现一个简单的http服务器

实现一个简单的http服务器,功能类似与apache服务器,能够将本地电脑作为一个后台服务器供客户端访问。 该实现只是一个简单的原型,用户跨域访问。...
  • qpx0033
  • qpx0033
  • 2015年11月18日 12:48
  • 341

网络编程知识总结 之 简单的iOS HTTP服务器

title: 网络编程知识总结 之 简单的iOS HTTP服务器 date: 2017-06-28 23:20:42 tags: [iOS,网络编程]本文主要是通过OC实现一个简单的iOS HTT...
  • zenggen021151
  • zenggen021151
  • 2017年07月31日 19:54
  • 210

简单的http服务器java

package jiankongLinux; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp...
  • cs948294549
  • cs948294549
  • 2016年09月05日 17:30
  • 307

自己实现一个简单版的HashMap

public class MyHashMap { //默认初始化大小 16 private static final int DEFAULT_INITIAL_CAPACI...
  • uhgagnu
  • uhgagnu
  • 2017年03月03日 18:41
  • 557

一个简易的java http服务器

TTP是个大协议,完整功能的HTTP服务器必须响应资源请求,将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST等)。处理不存在的文件请求,返回各种形式的状态码,解析MIME类...
  • WALLEZhe
  • WALLEZhe
  • 2017年03月16日 16:32
  • 1097
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己如何实现简单的http服务器
举报原因:
原因补充:

(最多只允许输入30个字)