一个简单的Web服务器程序(java实现)
2015-04-14 00:51
716 查看
此程序的功能是:接受客户端请求,并返回一个html页面,页面中可以包含png格式的图片。
运行方式:1.将代码复制进自己的java工程中,将你的html文件以及图片文件放入一个名为“root”的文件夹,然后将此文件夹放在e盘;
2.运行程序,打开浏览器,访问“localh:333/index.html” ,便可访问到网页内容。
代码清单如下:
运行方式: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; } }
相关文章推荐
- 利用java实现一个简单的远程监控程序
- 用java实现的一个简单的定时报警程序
- 一个java实现的简单文件下载程序
- 利用java实现一个简单的远程监控程序
- 用java实现的一个简单web服务器程序
- 用Java实现一个简单的服务器与客户端程序
- 利用java实现一个简单的远程监控程序
- 利用java实现一个简单的远程监控程序
- Java实现一个小说采集程序的简单实例
- 用java编写一个简单的字符串加密解密程序,将字符串分成若干行,实现字符串以一列一列读取,并还原之前输入的字符串。这里实现4行输出。
- 一个Java实现的简单的多个客户端聊天程序(未测试)
- Java实训——创建一个窗体程序,实现简单的数学加、减法测试。
- 简单说明什么是递归?什么情况会使用?并使用Java实现一个简单的递归程序。
- java中集合的运用,实现一个简单的购物程序
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)
- 【Java】Swing+IO流实现一个简单的文件加密程序(较完整版)
- 一个简单的程序来访问该数据库,实现 show tables 功能
- 用java实现一个简单的单用户登陆功能的思路
- 一个参考Java开源框架Netty-ChannelBuffer类的简单实现