java实现服务器程序_一个简单的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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值