最后完善的JAVA WEB服务器源代码

来源:百度文库 编辑:神马文学网 时间:2024/03/29 18:18:16
[转载 原文链接:]
最后完善的JAVA WEB服务器源代码
--------------------------------------------------------------------------------
前言:
我写的JAVA2WEBSERVER(代码以前也发表过)功能上已经得到很大改善,虽然实用性不强,目的是想通过这个程序多点了解HTTP协议和作为JAVA编程的入门练习,可以说只是一个WEB服务器的模型。但是已经具备基本的WEB服务器的功能,上次发表的程序没有实现传送图片等其他MIME类型,这次支持了。现在我把程序源代码放上来,希望它能够给想从事JAVA网络编程的初学者一些思路上启发,同时希望与其他JAVA爱好者交流。
一、目录结构:
/-jws

├─conf
│ │ mime.types
│ │ httpd.conf

├─classes
│ │
│ │ jws.java
│ │
│ ├─container
│ │ │
│ │ └─staticsou
│ │ │
│ │ │ dealLocalFile.java
│ │
│ │
│ └─http
│ │ jwsconf.java
│ │ HttpRequest.java
│ │ HttpResponse.java
│ │ HttpStatusCodes. java
│ │ HttpConnect.java

└─htdocs

│ index.html

└─doc
│ readme.htm
│ index.html
二、运行测试:
编译:
在编译前首先在http://www.sun.com 下载JDK1.2或更高的版本。
安装JDK1.2;
确认目录、文件的位置与上文说明的相同;
在classes 目录下输入 javac jws.java, 如果编译通过则进行下一步的操作。
运行:
在classes 目录下输入
java jws
如果看到server Start 说明服务器运行成功。
测试:
在htdocs 目录及其子目录下放置一些 .html 文件,其中一个文件的文件名为index.html。
启动一个浏览器,在地址栏输入:http://localhost/
确认是否看到了htdocs/index.html文件的页面。
输入http://localhost/doc/
确认是否看到了htdocs/doc/index.html
输入一个不存在的目录和文件如
http://localhost/none
确认浏览器是否收到了WEB服务器发回的404错误。
相关资料:
RCF文档 编号2068 来源:http://www.internic.net
java2类库说明 来源:http://www.sun.com
运行环境:
编译运行环境:
JAVA1.2
操作系统
Windows、Linux及其他JAVA1.2支持的操作系统。
jws.java
----------------------------------------------
import http.*;
public class jws{
public static void main(String args[]){
jwsconf serverconf=new jwsconf();
HttpConnect Http= new HttpConnect();
Http.Listen();
}//end main()
}//end class jws
jwsconf.java
--------------------------------------------
package http;
import java.io.*;
import java.util.*;
public class jwsconf{
private static Hashtable mimeType;
private static Hashtable HttpConf;
public jwsconf(){
mimeType = new Hashtable();
HttpConf = new Hashtable();
ConfConstrue(mimeType , "../conf/mime.types",‘R‘);
ConfConstrue(HttpConf , "../conf/httpd.conf",‘L‘);
}//end jwsconf()
private void ConfConstrue (Hashtable Table, String filename, char type){
String FileLine="";
int j=0,beginIndex=-1,endIndex=-1;
String str[]= new String[50];
try{
BufferedReader rfStream=new BufferedReader( new FileReader(filename) );
while (rfStream.ready()){
FileLine = rfStream.readLine();
FileLine+="\n";
str[1]=null;
if (!FileLine.equals("")){
for (int i=0;i
if ( beginIndex!=-1 && ( FileLine.charAt(i)==‘ ‘ ||FileLine.charAt(i)==‘\t‘ || FileLine.charAt(i)==‘\n‘ ||FileLine.charAt(i)==‘\r‘ ) ){
if (endIndex==-1){
endIndex=i;
if (beginIndex!=endIndex){
str[j++]=FileLine.substring(beginIndex, endIndex);
}
beginIndex=-1;
endIndex=-1;
}
}
if ( FileLine.charAt(i)!=‘ ‘ && FileLine.charAt(i)!=‘\t‘ ){
if (beginIndex==-1) {
if (FileLine.charAt(i)==‘#‘){
break;}
beginIndex=i;
continue;}//end if
}//end if
}//end for
}//end if
if (type==‘R‘){
for (int i=1;iTable.put(str[i],str[0]);
}
}//end if
if (type==‘L‘){
if (j>2){
String[] tmp=new String[j-1];
int p=0;
for (int i=1;itmp[p++]=str[i];}
Table.put(str[0].toLowerCase(),tmp);
}else{
if ( str[1]==null){
str[1]="";}
Table.put(str[0].toLowerCase(),str[1]);}
}//end if
beginIndex=-1;
endIndex=-1;
j=0;
}// end while
}
catch(IOException E){}
}//end ConfConstrue();
public static String GetMime(String RequestSouc){
String Getmime;
RequestSouc = RequestSouc.substring( RequestSouc.lastIndexOf(‘.‘)+1,RequestSouc.length() );
Getmime=(String)mimeType.get(RequestSouc);
if (Getmime==null){
return HttpConf("DefaultType");
}
return "Content-Type: " + Getmime+";";
}
public static String HttpConf(String key){
return (String)HttpConf.get(key.toLowerCase());
}
public static String[] HttpConfM(String key){
return (String[])HttpConf.get(key.toLowerCase());
}
}//end class jwsconf
HttpStatusCodes.java
----------------------------------------
package http;
public class HttpStatusCodes{
String StatusCode200="HTTP/1.0 200 OK";
String StatusCode403="HTTP/1.0 403 Forbidden";
String StatusCode404="HTTP/1.0 404 Not Found";
String StatusCode405="HTTP/1.0 405 Method Not Allowed";
public String toString(int code){
switch(code){
case 200: return StatusCode200;
case 403: return StatusCode403;
case 404: return StatusCode404;
case 405: return StatusCode405;
}
return null;
}
}//end class HttpStatusCodes
HttpConnect.java
-------------------------------------------------
package http;
import java.io.*;
import java.net.*;
import java.lang.*;
//-------------------- class ConnectThread -----------------
public class HttpConnect{
Socket ConnectSocket=null;
ServerSocket ListenSocket=null;
// static jwsconf httpconf=new jwsconf();
byte readfromfile[];
public HttpConnect(){
System.out.print("Start Server");
try{
ListenSocket = new ServerSocket(Integer.parseInt(jwsconf.HttpConf("Port"),10),
Integer.parseInt(jwsconf.HttpConf("MaxKeepAliveRequests"),10));
}//end try
catch (IOException e) {}//end catch
System.out.println(" OK!");
}//end HttpConnect()
public void Listen(){
for(;{
try{
ConnectSocket=ListenSocket.accept();
}//end try
catch (IOException e) {
}
ConnectThread HttpThread=new ConnectThread(ConnectSocket);
HttpThread.start();
}//end for
}
}//end class HttpConnect
class ConnectThread extends Thread{
private HttpRequest httprequest = null;
private HttpResponse httpresponse = null;
Socket Client;
BufferedReader receivmsg;
PrintStream sendmsg;
String ReadFromClient[];
ConnectThread(Socket ConnectSocket){
Client=ConnectSocket;
}
public void run(){
int r=0;
System.out.print("accept From " + Client.getInetAddress().getHostAddress() + "\n");
ReadFromClient=new String[1024];
try{
receivmsg =new BufferedReader(new InputStreamReader(Client.getInputStream()));
sendmsg =new PrintStream(Client.getOutputStream());
ReadFromClient[r++] = receivmsg.readLine();
//System.out.println(ReadFromClient[r]);
int c=0,off=0;
char[] readbytes=new char[1024*1024];
while(receivmsg.ready()){
c = receivmsg.read();
//System.out.print((char)c);
if (c == ‘\n‘){
ReadFromClient[r]=new String(readbytes,0,off-1);
off=0;
r++;
continue;
}
readbytes[off++]=(char)c;
}
httprequest = new HttpRequest(ReadFromClient); //处理浏览器发来的请求
httpresponse = new HttpResponse(sendmsg,httprequest);
httpresponse.Toclient(); //输出信息到浏览器
CloseConnect();
}catch (IOException e) {
CloseConnect();
}//end catch
}//end run()
void CloseConnect(){
try{
receivmsg.close();
sendmsg.close();
Client.close();
}catch (IOException e) {}//end catch
}
}//-------------------- end class ConnectThread ---------------
HttpRequest.java
------------------------------------------
package http;
import java.io.*;
public class HttpRequest{
public String HttpMethomd;
String Requesturl;
String RequestSouc;
String HttpVersion;
String GetRequest;
int statuscode=200;
String[] ClientReceive=null;
HttpRequest(String[] ClientReceive ){
this.ClientReceive=ClientReceive;
ConstrueRequest();
}//end HttpRequest()
void ConstrueRequest(){
try{
RequestSouc=ClientReceive[0];
int indexpre,indexnex;
if (ClientReceive[0]==""){
statuscode=404;
return;}
indexpre=ClientReceive[0].indexOf(‘ ‘);
HttpMethomd=ClientReceive[0].substring(0,indexpre);
indexpre++;
indexnex=ClientReceive[0].indexOf(‘ ‘,indexpre);
Requesturl = ClientReceive[0].substring(indexpre,indexnex);
if ( Requesturl.lastIndexOf(‘?‘) != -1 ){
RequestSouc=Requesturl.substring( 0,Requesturl.lastIndexOf(‘?‘) );
GetRequest=Requesturl.substring( Requesturl.lastIndexOf(‘?‘)+1,Requesturl.length() );
}else{
GetRequest="";
RequestSouc=Requesturl;
}
HttpMethomd.toUpperCase();
}catch (StringIndexOutOfBoundsException e){
HttpMethomd="GET";
statuscode=500;
System.out.println("err1");
return;}
catch (NullPointerException e){
HttpMethomd="GET";
statuscode=500;
System.out.println("err2");
return;}
}//end ConstrueRequest()
}//end class HttpRequest
HttpResponse.java
--------------------------------------------------------------
package http;
import java.io.*;
import container.servlet.*;
import container.staticsou.*;
public class HttpResponse{
HttpRequest httprequest;
static byte readfromfile[];
HttpStatusCodes HttpStatus=new HttpStatusCodes();
String HttpStatusMsg=null;
PrintStream sendmsg=null;
HttpResponse(PrintStream sendmsg,HttpRequest httprequest){
this.httprequest=httprequest;
this.sendmsg=sendmsg;
}//end HttpResponse()
public void Toclient(){
if ( httprequest.HttpMethomd.equals("GET") ){
dealGet();}
if( httprequest.HttpMethomd.equals("POST") ){
dealPost();}
if (httprequest.statuscode!=200){
sendmsg.print(HttpStatus.toString(httprequest.statuscode)+"\r\n\r\n");
sendmsg.print( HttpStatus.toString(httprequest.statuscode));
return;
}
if (httprequest.RequestSouc.startsWith("/servlet/")){ //是否是 servlet 的目录映射
ServletHold servlethold= new ServletHold(httprequest);
servlethold.LoadClasses(httprequest.RequestSouc);
return;
}//end if
if ( httprequest.HttpMethomd.equals("GET") ){
dealLocalFile FileHandle= new dealLocalFile(httprequest.RequestSouc);
if (FileHandle.FileExists()==0){
sendmsg.print(HttpStatus.toString(404)+"\r\n\r\n");
sendmsg.print( HttpStatus.toString(404));
return;
}
//byte[] msg = FileHandle.ReadLocalFile();
byte[] msg = FileHandle.GetContent();
sendmsg.print(HttpStatus.toString(200)+"\r\n");
sendmsg.print(jwsconf.GetMime(httprequest.RequestSouc)+"\r\n\r\n" );
sendmsg.write(msg,0,msg.length);
}//end if
return;
}
public void dealGet(){
return;
}
public void dealPost(){
sendmsg.print( HttpStatus.toString(405)+"\r\n\r\n");
sendmsg.print( HttpStatus.toString(httprequest.statuscode));
return;}
}
dealLocalFile.java
------------------------------------------------
package container.staticsou;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.*;
import java.util.Locale;
import java.util.Date;
import http.*;
public class dealLocalFile{
File localfile=null;
String RequestSouc;
byte[] GetContent;
boolean ListDirectory=true;
public dealLocalFile(String RequestSouc){
boolean defaultname=false;
this.RequestSouc=RequestSouc;
if ( RequestSouc.endsWith("/") ){
String fn[]=jwsconf.HttpConfM("DirectoryIndex");
for (int i=0;ilocalfile = new File(jwsconf.HttpConf("DocumentRoot"),RequestSouc+fn[i]);
if ( FileExists()==2 ){
defaultname=true;
break;}
}//end for
if (defaultname==false){
localfile = new File( jwsconf.HttpConf("DocumentRoot"),RequestSouc.substring(0,RequestSouc.length()-1) );}
}else{
localfile=new File(jwsconf.HttpConf("DocumentRoot"),RequestSouc);
if ( FileExists()==1){
ListDirectory=false;}
}
}
public byte[] GetContent(){
if( localfile.isDirectory() ){
DirectoryList();
}else{
ReadLocalFile();}
return GetContent;
}//end GetContent()
private void ReadLocalFile(){
GetContent = new byte[(int) localfile.length()];
try{
FileInputStream readfile = new FileInputStream(localfile);
try{
readfile.read( GetContent,0,readfile.available() );
readfile.close();
}catch (IOException e){}
}catch (FileNotFoundException e){}
}//end ReadLocalFile()
private void DirectoryList(){
String filenames[]=localfile.list();
String DirectoryHtml;
File checkf;
String DataString="";
String ParentDirectory=RequestSouc.substring(0, RequestSouc.lastIndexOf(‘/‘,RequestSouc.length()-2) );
DirectoryHtml="";
DirectoryHtml+="
Index of "+RequestSouc+"
";
DirectoryHtml+="Name\t\t\tLast modified\t\tSize Description\r\n";
DirectoryHtml+="--------------------------------------------------------------------------------Parent Directory\r\n";
for(int i=0;icheckf = new File(jwsconf.HttpConf("DocumentRoot"),filenames[i]);
if ( checkf.isDirectory() ){
filenames[i]+=‘/‘;} //如果是目录就在后面加 ‘/‘
DataString = new SimpleDateFormat("dd MMM yyyy HH:mm:ss ‘GMT‘",Locale.US).format(new Date(checkf.lastModified()));
DirectoryHtml+="" + filenames[i] + "\t\t\t"
+ DataString
+ "\t\t"
+ checkf.length() + "\r\n";
}
DirectoryHtml+="
--------------------------------------------------------------------------------
";
GetContent = DirectoryHtml.getBytes();
}
public int FileExists(){
if (localfile.exists() && localfile.isDirectory() && ListDirectory==true) {
return 1;}
if (localfile.exists() && !localfile.isDirectory()){
return 2;
}else{return 0;}
}//end FileExists()
}
两个配置文件:
mime.types
---------------------------------------------------------
application/EDI-Consent
application/EDI-X12
application/EDIFACT
application/activemessage
application/andrew-inset ez
application/applefile
application/atomicmail
application/cals-1840
application/commonground
application/cybercash
application/dca-rft
application/dec-dx
application/eshop
application/hyperstudio
application/iges
application/mac-binhex40 hqx
application/mac-compactpro cpt
application/macwriteii
application/marc
application/mathematica
application/msword doc
application/news-message-id
application/news-transmission
application/octet-stream bin dms lha lzh exe class
application/oda oda
application/pdf pdf
application/pgp-encrypted
application/pgp-keys
application/pgp-signature
application/pkcs10
application/pkcs7-mime
application/pkcs7-signature
application/postscript ai eps ps
application/prs.alvestrand.titrax-sheet
application/prs.cww
application/prs.nprend
application/remote-printing
application/riscos
application/rtf rtf
application/set-payment
application/set-payment-initiation
application/set-registration
application/set-registration-initiation
application/sgml
application/sgml-open-catalog
application/slate
application/smil smi smil
application/vemmi
application/vnd.3M.Post-it-Notes
application/vnd.FloGraphIt
application/vnd.acucobol
application/vnd.anser-web-certificate-issue-initiation
application/vnd.anser-web-funds-transfer-initiation
application/vnd.audiograph
application/vnd.businessobjects
application/vnd.claymore
application/vnd.comsocaller
application/vnd.dna
application/vnd.dxr
application/vnd.ecdis-update
application/vnd.ecowin.chart
application/vnd.ecowin.filerequest
application/vnd.ecowin.fileupdate
application/vnd.ecowin.series
application/vnd.ecowin.seriesrequest
application/vnd.ecowin.seriesupdate
application/vnd.enliven
application/vnd.epson.salt
application/vnd.fdf
application/vnd.ffsns
application/vnd.framemaker
application/vnd.fujitsu.oasys
application/vnd.fujitsu.oasys2
application/vnd.fujitsu.oasys3
application/vnd.fujitsu.oasysgp
application/vnd.fujitsu.oasysprs
application/vnd.fujixerox.docuworks
application/vnd.hp-HPGL
application/vnd.hp-PCL
application/vnd.hp-PCLXL
application/vnd.hp-hps
application/vnd.ibm.MiniPay
application/vnd.ibm.modcap
application/vnd.intercon.formnet
application/vnd.intertrust.digibox
application/vnd.intertrust.nncp
application/vnd.is-xpr
application/vnd.japannet-directory-service
application/vnd.japannet-jpnstore-wakeup
application/vnd.japannet-payment-wakeup
application/vnd.japannet-registration
application/vnd.japannet-registration-wakeup
application/vnd.japannet-setstore-wakeup
application/vnd.japannet-verification
application/vnd.japannet-verification-wakeup
application/vnd.koan
application/vnd.lotus-1-2-3
application/vnd.lotus-approach
application/vnd.lotus-freelance
application/vnd.lotus-organizer
application/vnd.lotus-screencam
application/vnd.lotus-wordpro
application/vnd.meridian-slingshot
application/vnd.mif mif
application/vnd.minisoft-hp3000-save
application/vnd.mitsubishi.misty-guard.trustweb
application/vnd.ms-artgalry
application/vnd.ms-asf
application/vnd.ms-excel xls
application/vnd.ms-powerpoint ppt
application/vnd.ms-project
application/vnd.ms-tnef
application/vnd.ms-works
application/vnd.music-niff
application/vnd.musician
application/vnd.netfpx
application/vnd.noblenet-directory
application/vnd.noblenet-sealer
application/vnd.noblenet-web
application/vnd.novadigm.EDM
application/vnd.novadigm.EDX
application/vnd.novadigm.EXT
application/vnd.osa.netdeploy
application/vnd.powerbuilder6
application/vnd.powerbuilder6-s
application/vnd.rapid
application/vnd.seemail
application/vnd.shana.informed.formtemplate
application/vnd.shana.informed.interchange
application/vnd.shana.informed.package
application/vnd.street-stream
application/vnd.svd
application/vnd.swiftview-ics
application/vnd.truedoc
application/vnd.visio
application/vnd.webturbo
application/vnd.wrq-hp3000-labelled
application/vnd.wt.stf
application/vnd.xara
application/vnd.yellowriver-custom-menu
application/wita
application/wordperfect5.1
application/x-bcpio bcpio
application/x-cdlink vcd
application/x-chess-pgn pgn
application/x-compress
application/x-cpio cpio
application/x-csh csh
application/x-director dcr dir dxr
application/x-dvi dvi
application/x-futuresplash spl
application/x-gtar gtar
application/x-gzip
application/x-hdf hdf
application/x-html(javascript) js
application/x-koan skp skd skt skm
application/x-latex latex
application/x-netcdf nc cdf
application/x-sh sh
application/x-shar shar
application/x-shockwave-flash swf
application/x-stuffit sit
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-texinfo texinfo texi
application/x-troff t tr roff
application/x-troff-man man
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-wais-source src
application/x400-bp
application/xml
application/zip zip
audio/32kadpcm
audio/basic au snd
audio/midi mid midi kar
audio/mpeg mpga mp2 mp3
audio/vnd.qcelp
audio/x-aiff aif aiff aifc
audio/x-pn-realaudio ram rm
audio/x-pn-realaudio-plugin rpm
audio/x-realaudio ra
audio/x-wav wav
chemical/x-pdb pdb xyz
image/bmp bmp
image/cgm
image/g3fax
image/gif gif
image/ief ief
image/jpeg jpeg jpg jpe
image/naplps
image/png png
image/prs.btif
image/tiff tiff tif
image/vnd.dwg
image/vnd.dxf
image/vnd.fpx
image/vnd.net-fpx
image/vnd.svf
image/vnd.xiff
image/x-cmu-raster ras
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/delivery-status
message/disposition-notification
message/external-body
message/http
message/news
message/partial
message/rfc822
model/iges igs iges
model/mesh msh mesh silo
model/vnd.dwf
model/vrml wrl vrml
multipart/alternative
multipart/appledouble
multipart/byteranges
multipart/digest
multipart/encrypted
multipart/form-data
multipart/header-set
multipart/mixed
multipart/parallel
multipart/related
multipart/report
multipart/signed
multipart/voice-message
text/css css
text/directory
text/enriched
text/html html htm
text/plain asc txt
text/prs.lines.tag
text/rfc822-headers
text/richtext rtx
text/rtf rtf
text/sgml sgml sgm
text/tab-separated-values tsv
text/uri-list
text/vnd.abc
text/vnd.flatland.3dml
text/vnd.fmi.flexstor
text/vnd.in3d.3dml
text/vnd.in3d.spot
text/vnd.latex-z
text/x-setext etx
text/xml xml
video/mpeg mpeg mpg mpe
video/quicktime qt mov
video/vnd.motorola.video
video/vnd.motorola.videop
video/vnd.vivo
video/x-msvideo avi
video/x-sgi-movie movie
x-conference/x-cooltalk ice
httpd.conf
--------------------------------------------------
Port 8000
MaxKeepAliveRequests 1024
DocumentRoot ../htdocs
DefaultType text/plain
DirectoryIndex index.html index.php index.php3 index.htm
------------------------
作者:XYZ※版权所有,转载请注明来源【CGI编程设计室】