文件名: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 (); } } }
请多指教

|