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

--------------------------------------------------------------------------------

前言:

我写的JAVA2

WEBSERVER(代码以前也发表过)功能上已经得到很大改善,虽然实用性不强,目的是想通过这个程序多点了解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(;

11586_668498_1.gif{

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值