您的位置:首页 > 编程语言 > Java开发

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

2015-04-14 00:51 716 查看
此程序的功能是:接受客户端请求,并返回一个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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐