一个简单的Web服务器程序(java实现)

此程序的功能是:接受客户端请求,并返回一个html页面,页面中可以包含png格式的图片。

运行方式:1.将代码复制进自己的java工程中,将你的html文件以及图片文件放入一个名为“root”的文件夹,然后将此文件夹放在e盘;

                    2.运行程序,打开浏览器,访问“localh:333/index.html” ,便可访问到网页内容。

代码清单如下:


package com.jht;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static String ROOT = "E:/root";

	public static void main(String[] args) throws IOException {
		//创建服务器端socket端口为333
		ServerSocket serverSocket = new ServerSocket(333);    
		
		//循环地接受客户端的请求
		while (true) {
			//服务器端serverSocket接受客户端的请求,并创建客户端socket对象
			Socket socket = serverSocket.accept();
			
			//为在socket上获得的输入流创建一个使用默认字符集的 InputStreamReader
			InputStreamReader isr = new InputStreamReader(
					socket.getInputStream());
			
			//创建一个缓冲器来包装字符流isr
			BufferedReader br = new BufferedReader(isr);
			
			//读取HTTP请求报文的起始行,并根据空格分割开,存入数组,因此变量temp[1]就是请求的url
			String[] temp = br.readLine().split(" ");
			
			//创建socket的输出流,即需要向客户端传输的东西
			OutputStream outputstream = socket.getOutputStream();
			
			//在控制台输出请求的url来判断程序运行情况
			System.out.println(temp[1]);
			
			//调用数据处理函数
			data(outputstream, temp[1],socket);
		}

	}

	private static Object data(OutputStream outputstream, String temp,Socket s)
			throws IOException,NullPointerException {
		/* 简要介绍传入函数的三个参数
		 * outputstream是输出流,也就是要向客户端输出的东西
		 * temp是HTTP的请求报文所请求的url,关于这一点请参照HTTP报文结构进行理解
		 * s是客户端的socket
		 * 
		 */
		//以下操作是生成HTTP响应报文并存入变量message
		
		//HTTP响应报文的起始行
		String message = "HTTP/1.1 200 OK\r\n";
		
		
		if (temp.contains("html")) {
			/* 如果url中包含"html",
			 * 说明客户端所请求的是个html文件,所以在响应头中要设置网页内容类型为text/html,
			 * 由于报文首部与报文实体之间要有一行空格,所以下面在设置网页内容后加了两次回车换行符
			 * 像Content-Type这样的东西属于报文首部,而图片这种文件属于报文实体,注意区分呀。
			*/
			message += "Content-Type:text/html\r\n\r\n";
			
			//用本地的HTML文件生成文件输入流,并包装为缓存器
			FileInputStream fis = new FileInputStream(ROOT + temp);
			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
			
			//将指向HTML的缓存器逐行加入到message中,即添加进HTTP响应报文
			String temps = "";
			while ((temps = br.readLine()) != null)
				message += temps;
			
			//对message调用getByte()方法,将String类型的message转换为字节类型并写入到输出流
			outputstream.write(message.getBytes());
			
			//刷新输出流,即将此输出流返回到客户端(浏览器)进行显示,然后关闭输出流。
			outputstream.flush();
			outputstream.close();
			br.close();
		} else if (temp.contains("png")) {
			/*
			 * 由于浏览器会自动根据html代码内的图片src地址来生成请求并发送到服务器以获取图片,
			 * 所以浏览器的第二次请求的url中会有图片的后缀名png,因此以下代码是用来向浏览器传回图片的
			 */
			
			//依旧是设置Content-Type响应首部,只不过这次是返回一个图片
			message += "Content-Type:image/png\r\n\r\n";
			
			//将图片文件逐层进行包装,最终包装为DataInputStream类型
			DataInputStream dis = new DataInputStream(new BufferedInputStream(
					new FileInputStream(ROOT + temp)));
	
			/*
			 * 接下来的几行代码是实现文件数据I/O的常用固定模式,buf是个字节类型的数组,用作缓存;
			 * read是个标志位,当对dis(DataIuputStream类型的变量)调用read(buf)函数时,
			 * 意思是将dis的数据写入buf,当文件读取完毕时,也就是最后一次调用read()时,写入buf的
			 * 数据为空,因此会返回-1给标志位变量read。当变量read的值不是-1时,说明dis还没读取完,
			 * 所以在循环中继续读取,并将buf写入到输出流outputstream中。read()和write()方法的详情请自行
			 * 查阅资料。
			 */
			byte[] buf = new byte[1024];
			int read = 0;
			while ((read = dis.read(buf)) != -1) {
				outputstream.write(buf, 0, read);
			}
			outputstream.flush();
			s.close();
			dis.close();
		}
		return null;
	}
}


                  


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值