package com.two.server;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.StringTokenizer;
/**
* 用Java语言实现HTTP服务器,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用
* PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用
* String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用
* write(byte[])方法写入二进制数据.
*
* 以工程所在目录为web的根目录。 在工程的根目录下放一个大概如下的index.html
*
* <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
* "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta
* http-equiv="Content-Type" content="text/html; charset=utf-8">
* <title>简单的测试</title> </head> <body> 你好!这是一个 简单的web服务器。<br>
* 这是一个图片!<br>
*
* <form action="/index.html"> <img alt="" src="images/test.gif"><br>
* 姓名:<input type="text" name="name" /><br>
* 密码:<input type="password" name="pass"></input><br>
* <input type="submit"/> </form> </body> </html>
*
* 放入图片位置: 工程根目录/images/test.gif <br>
* 打开浏览器输入http://localhost/index.html 可以展示index.html
*
* @author guazi
*/
public class SimpleHttpServer implements Runnable {
ServerSocket serverSocket;// 服务器Socket
/**
* 服务器监听端口, 默认为 80.
*/
public static int PORT = 9528;// 标准HTTP端口
/**
* 开始服务器 Socket 线程.
*/
public SimpleHttpServer() {
try {
serverSocket = new ServerSocket(PORT);
} catch (Exception e) {
System.out.println("无法启动HTTP服务器:" + e.getMessage());
}
if (serverSocket == null)
System.exit(1);// 无法开始服务器
new Thread(this).start();
System.out.println("HTTP服务器正在运行,端口:" + PORT);
}
/**
* 运行服务器主线程, 监听客户端请求并返回响应.
*/
public void run() {
while (true) {
try {
Socket client = null;// 客户Socket
client = serverSocket.accept();// 客户机(这里是 IE 等浏览器)已经连接到当前服务器
if (client != null) {
System.out.println("连接到服务器的用户:" + client);
try {
// 第一阶段: 打开输入流
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
System.out.println("客户端发送的请求信息: ***************");
// 读取第一行, 请求地址
System.out.println("http协议头部信息:");
String line = in.readLine();
System.out.println(line);
String resource = line.substring(line.indexOf('/'),
line.lastIndexOf('/') - 5);
// 获得请求的资源的地址
resource = URLDecoder.decode(resource, "utf-8");// 反编码
String method = new StringTokenizer(line).nextElement()
.toString();// 获取请求方法, GET 或者 POST
// 读取浏览器发送过来的请求参数头部信息
while ((line = in.readLine()) != null) {
System.out.println(line);
if (line.equals(""))
break;
}
System.out.println("http协议头部结束 ***************");
System.out.println("用户请求的资源是:" + resource);
System.out.println("请求的类型是: " + method);
String params = null;
if (resource.indexOf("?") > -1) { //indexOf 返回指定字符在此字符串中第一次出现处的索引。
params = resource
.substring(resource.indexOf("?") + 1);
resource = resource.substring(0, resource
.indexOf("?"));
} //此处结束:params所偶请求参数(name=asdf&pass=asdf) , resource地址(/index.html)
// 显示 POST 表单提交的内容, 这个内容位于请求的主体部分
if ("POST".equalsIgnoreCase(method)) {
params= "";
if (params != null) {
params += in.readLine();
}
}
System.out.println("打印提交的数据:");
printParams(params);
// 读取资源并返回给客户端
fileReaderAndReturn(resource, client);
// 关闭客户端链接
client.close();
System.out.println("客户端返回完成!");
} catch (Exception e) {
System.out.println("HTTP服务器错误:" + e.getMessage());
}
}
} catch (Exception e) {
System.out.println("HTTP服务器错误:" + e.getMessage());
}
}
}
/**
* 读取一个文件的内容并返回给浏览器端.
*
* @param fileName
* 文件名
* @param socket
* 客户端 socket.
* @throws IOException
*/
void fileReaderAndReturn(String fileName, Socket socket) throws IOException {
if ("/".equals(fileName)) {// 设置欢迎页面,呵呵! 默认为index.html
fileName = "/index.html";
}
fileName = fileName.substring(1);
PrintStream out = new PrintStream(socket.getOutputStream(), true);
File fileToSend = new File(fileName);
String fileEx = fileName.substring(fileName.indexOf(".") + 1);
String contentType = null;
// 设置返回的内容类型
// 此处的类型与tomcat/conf/web.xml中配置的mime-mapping类型是一致的。测试之用,就写这么几个。 (参考contentType)
if ("htmlhtmxml".indexOf(fileEx) > -1) { //(显示)匹配文件类型 , 如果是html,htm,xml..
contentType = "text/html;charset=UTF-8";
} else if ("jpeggifbpmpng".indexOf(fileEx) > -1) { // (下载)如果是jpeg,jpg,gif,bpm,png,pdf等等..
contentType = "application/binary";
}
// else if ("jpg".indexOf(fileEx) > -1) { // (图片显示)
// contentType = "image/JPG";
// }
else if("pdf".inde
二维码+服务器应用demo
5星 · 超过95%的资源 需积分: 10 42 浏览量
2014-12-12
13:33:42
上传
评论
收藏 822KB ZIP 举报
Cemmmmer
- 粉丝: 3
- 资源: 16
最新资源
- 2%EF%BC%9A%E9%99%95%E8%A5%BF%E
- yyspdz62_944.apk
- SAP公司间采购EDI配置-如何触发自动MIRO.docx
- python197基于图像识别的仪表实时监控系统.rar
- python196基于循环神经网络的情感分类系统.rar
- I2C驱动SHT30温湿度传感器和LCD12864使用例程(RSCG12864B)
- python193中学地理-中国的江河湖泊教学网(django).rar
- python191基于时间序列分析的大气污染预测软件(django).rar
- python190基于人脸识别智能化小区门禁管理系统.rar
- python189某医院体检挂号系统.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈