java http server from http://pont.net

该博客展示了用Java实现HTTP Server的代码。通过ServerSocket监听端口,接受新连接后创建新线程处理请求。处理请求时,根据GET方法获取文件名,若文件存在返回200状态,不存在则返回404状态,并将相应内容发送给客户端。
//***************************************
// HTTP Server 
// fpont June 2000
// server implements HTTP GET method
//***************************************


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


public class httpServer 
{
    
    public static void main(String args[]) {
	
	int port;
	ServerSocket server_socket;
	
	
	try { 
	    port = Integer.parseInt(args[0]);
	}
	catch (Exception e) {
	    port = 1500;
	}
	

	try {
	    
	    server_socket = new ServerSocket(port);
	    System.out.println("httpServer running on port " + 
			       server_socket.getLocalPort());
	    
	    // server infinite loop
	    while(true) {
		Socket socket = server_socket.accept();
		System.out.println("New connection accepted " +
				   socket.getInetAddress() +
				   ":" + socket.getPort());
		
		// Construct handler to process the HTTP request message.
		try {
		    httpRequestHandler request = 
			new httpRequestHandler(socket);
		    // Create a new thread to process the request.
		    Thread thread = new Thread(request);
		    
		    // Start the thread.
		    thread.start();
		}
		catch(Exception e) {
		    System.out.println(e);
		}
	    }
	}
	
	catch (IOException e) {
	    System.out.println(e);
	}
    }
}


 
class httpRequestHandler implements Runnable
{
    final static String CRLF = "/r/n";
    Socket socket;
    InputStream input;
    OutputStream output;
    BufferedReader br;

    // Constructor
    public httpRequestHandler(Socket socket) throws Exception 
    {
	this.socket = socket;
	this.input = socket.getInputStream();
	this.output = socket.getOutputStream();
	this.br = 
	    new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    
    // Implement the run() method of the Runnable interface.
    public void run()
    {
	try {
	    processRequest();
	}
	catch(Exception e) {
	    System.out.println(e);
	}
    }
    
    private void processRequest() throws Exception
    {
	while(true) {
	    
	    String headerLine = br.readLine();
	    System.out.println(headerLine);
	    if(headerLine.equals(CRLF) || headerLine.equals("")) break;
	    
	    StringTokenizer s = new StringTokenizer(headerLine);
	    String temp = s.nextToken();
	    
	    if(temp.equals("GET")) {

		String fileName = s.nextToken();
		fileName = "." + fileName ;
		
		// Open the requested file.
		FileInputStream fis = null ;
		boolean fileExists = true ;
		try 
		    {
			fis = new FileInputStream( fileName ) ;
		    } 
		catch ( FileNotFoundException e ) 
		    {
			fileExists = false ;
		    }
		
		// Construct the response message.
		String serverLine = "Server: fpont simple java httpServer";
		String statusLine = null;
		String contentTypeLine = null;
		String entityBody = null;
		String contentLengthLine = "error";
		if ( fileExists )
		    {
			statusLine = "HTTP/1.0 200 OK" + CRLF ;
			contentTypeLine = "Content-type: " + 
			    contentType( fileName ) + CRLF ;
			contentLengthLine = "Content-Length: " 
			    + (new Integer(fis.available())).toString() 
			    + CRLF;
		    }
		else
		    {
			statusLine = "HTTP/1.0 404 Not Found" + CRLF ;
			contentTypeLine = "text/html" ;
			entityBody = "<HTML>" + 
			    "<HEAD><TITLE>404 Not Found</TITLE></HEAD>" +
			    "<BODY>404 Not Found" 
			    +"<br>usage:http://yourHostName:port/"
			    +"fileName.html</BODY></HTML>" ;
		    }
		
		// Send the status line.
		output.write(statusLine.getBytes());
		
		// Send the server line.
		output.write(serverLine.getBytes());
		
		// Send the content type line.
		output.write(contentTypeLine.getBytes());
		
		// Send the Content-Length
		output.write(contentLengthLine.getBytes());
		
		// Send a blank line to indicate the end of the header lines.
		output.write(CRLF.getBytes());
		
		// Send the entity body.
		if (fileExists)
		    {
			sendBytes(fis, output) ;
			fis.close();
		    }
		else
		    {
			output.write(entityBody.getBytes());
		    }
				
	    }
	}
	
	try {
	    output.close();
	    br.close();
	    socket.close();
	}
	catch(Exception e) {}
    }
    
    private static void sendBytes(FileInputStream fis, OutputStream os) 
	throws Exception
    {
	// Construct a 1K buffer to hold bytes on their way to the socket.
	byte[] buffer = new byte[1024] ;
	int bytes = 0 ;
	
	// Copy requested file into the socket's output stream.
	while ((bytes = fis.read(buffer)) != -1 ) 
	    {
		os.write(buffer, 0, bytes);
	    }
    }
    
    private static String contentType(String fileName)
    {
	if (fileName.endsWith(".htm") || fileName.endsWith(".html"))
	    {
		return "text/html";
	    }
	
	return "";
	
    }
    
}






#include <STC15F2K60S2.H> #include <smg.h> #include <init.h> #include <key.h> #include <wave.h> #include <led.h> #include <onewire.h> #include <iic.h> #include <intrins.h> #include <math.h> unsigned char key_up,key_down,key_val,key_old,key_slow_down; unsigned char smg_pos,smg_pont[8] = {0,0,0,0,0,0,0,0},smg_buf[8] = {10,10,10,10,10,10,10,10}; unsigned char smg_Slow_down; unsigned char ledbuf[8] = {0,0,0,0,0,0,0,0}; unsigned char temperature;//温度变量 unsigned char cs_temperature = 30;//温度参数 unsigned char cs_jl = 30;//距离参数 unsigned char smg_mode;//0环境状态 1运动检测 2参数设置 3统计数据 unsigned char sport_flag = 0;//0静止 1徘徊 2跑动 unsigned char sport_flag_gb = 0;//判断状态是否改变 unsigned char light_level;//光强等级 unsigned char rd_wave;//超声波 unsigned char cj_wave;//采集距离超声波 unsigned char relay_date;//继电器吸合次数 unsigned int time_3s; unsigned int time_1s;// unsigned int change_rd_wave;//距离改变值 unsigned int time_2s; unsigned char time_100ms; bit relay_flag; bit led_flag;//led闪烁标志位 bit jiejin;//1接近判断 bit high_temp;//高温判定 bit merue_flag;//采集标志位 bit start_cj_flag;//避免第一次采集 float ani1_Ad;//光敏 bit cs_flag;//0温度 1距离 bit sd_flag;//状态锁定标志位 bit qk_flag; void Delay750ms(void) //@12.000MHz { unsigned char data i, j, k; _nop_(); _nop_(); i = 35; j = 51; k = 182; do { do { while (--k); } while (--j); } while (--i); } void key_proc() { if(key_slow_down<10) return; key_slow_down = 0; key_val = key_read(); key_down = key_val & (key_val ^ key_old); key_up = ~key_val& (key_val ^ key_old); key_old = key_val; if(smg_mode==3) { if(key_old == 89) { qk_flag = 1; if(time_2s>=2000) { relay_date = 0; } } else { time_2s = 0; qk_flag = 0; } } switch(key_down) { case 4://界面切换 if(++smg_mode==4) smg_mode = 0; cs_flag = 0; break; case 5://参数界面 if(smg_mode==2) cs_flag ^= 1; break; case 8://+ if(smg_mode==2) { if(cs_flag==0) //温度参数界面 { cs_temperature++; if(cs_temperature==81) cs_temperature = 80; } else { cs_jl+=5; if(cs_jl==85) cs_jl = 80; } } break; case 9://- if(smg_mode==2) { if(cs_flag==0) //温度参数界面 { cs_temperature--; if(cs_temperature==19) cs_temperature = 20; } else { cs_jl-=5; if(cs_jl==15) cs_jl = 20; } } break; } } void smg_proc() { if(smg_Slow_down<90) return; smg_Slow_down = 0; ani1_Ad = ad_Read(0x01)/51; rd_wave = wave_Read(); temperature =read_temperature(); if(ani1_Ad>=3) light_level = 0; else if(ani1_Ad<3 && ani1_Ad>=2) light_level = 1; else if(ani1_Ad<2&&ani1_Ad>=0.5) light_level = 2; else if(ani1_Ad<0.5) light_level = 3; if(merue_flag==1)//运动状态采集 { if(start_cj_flag==1) change_rd_wave = abs(cj_wave - rd_wave);//变化距离 start_cj_flag = 1; cj_wave = rd_wave; merue_flag = 0; } if(change_rd_wave<cs_jl)//触发接近判定 jiejin = 1; else jiejin = 0; if(cs_temperature<temperature)//触发高温判定 high_temp = 1; else high_temp = 0; if(sd_flag==0)//可以改变状态 { if(change_rd_wave<5) //静止 sport_flag = 0; else if(change_rd_wave>=5&&change_rd_wave<10) //徘徊 sport_flag = 1; else if(change_rd_wave>=10) //跑动 sport_flag = 2; } if(sport_flag != sport_flag_gb) { sd_flag = 1;//状态锁定 sport_flag_gb = sport_flag; } switch(smg_mode) { case 0://环境状态 smg_buf[0] = 11;//C smg_buf[1] = temperature/10%10; smg_buf[2] = temperature%10; smg_buf[4] = 10; smg_buf[5] = 10; smg_buf[6] = 12;//n smg_buf[7] = light_level+1; break; case 1://运动检测状态 smg_buf[0] = 13;//L smg_buf[1] =sport_flag+1; smg_buf[2] =10; smg_buf[4] = 10; smg_buf[5] = rd_wave/100%10; smg_buf[6] = rd_wave/10%10;//n smg_buf[7] = rd_wave%10; break; case 2://参数界面 smg_buf[0] = 14;//P smg_buf[5] = smg_buf[2] = 10; smg_buf[4] = 10; if(cs_flag==0) { smg_buf[1] =11;//C smg_buf[6] = cs_temperature/10%10;// smg_buf[7] = cs_temperature%10; } else { smg_buf[1] =13;//L smg_buf[6] = cs_jl/10%10;// smg_buf[7] = cs_jl%10; } break; case 3://数据统计界面 smg_buf[0] = 12;//n smg_buf[1] = 11;//c smg_buf[2] = 10; smg_buf[3] = 10; smg_buf[4] =relay_date/1000? relay_date/1000%10:10; smg_buf[5] =relay_date/100? relay_date/100%10:10; smg_buf[6] = relay_date/10?relay_date/10%10:10;//n smg_buf[7] = relay_date%10; break; } } void led_proc() { unsigned char i; if(smg_mode!=2) { if(jiejin==1)//触发接近判定 灯亮 { ledbuf[0] = 1; ledbuf[1] = (light_level==0)?0:1; ledbuf[2] = (light_level>=2)?1:0; ledbuf[3] = (light_level==3)?1:0; } else { for(i=0;i<5;i++) ledbuf[i] = 0; } switch(sport_flag) { case 0: //静止 ledbuf[7] = 0; break; case 1: //徘徊 ledbuf[7] = 1; break; case 2://跑动 ledbuf[7] = led_flag; break; } if(high_temp==1&&jiejin==1) { relay(1); if(relay_flag==0) relay_date++; relay_flag = 1; } else { relay_flag = 0; relay(0); } } } void Timer0_Init(void) //1??@12.000MHz { AUXR &= 0x7F; //?????12T?? TMOD &= 0xF0; //??????? TL0 = 0x18; //??????? TH0 = 0xFC; //??????? TF0 = 0; //??TF0?? TR0 = 1; //???0???? ET0 = 1; EA = 1; } void timer0server() interrupt 1 { key_slow_down++; smg_Slow_down++; if(++smg_pos==8) smg_pos = 0; smg_disp(smg_pos,smg_buf[smg_pos],smg_pont[smg_pos]); disp_led(ledbuf); if(++time_1s == 1000) { time_1s = 0; merue_flag = 1;//开始采集 } if(sd_flag==1)//锁定 计时 { if(++time_3s==4000) { sd_flag = 0;//解锁 time_3s = 0; } if(qk_flag==1) { time_2s++; if(time_2s>2000) time_2s = 2001; } } if(sport_flag==2) { if(++time_100ms==100) { time_100ms = 0; led_flag ^= 1; } } } void main() { read_temperature(); Delay750ms(); Timer0_Init() ; system_init(); while(1) { led_proc(); key_proc(); smg_proc(); } } 这里ad_read在哪里
07-31
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值