import javaioIOException;
import ServerSocket;
import Socket;
/**
* Socket + Thread + FileIO
*
* 服务器运行机制
* 启动服务器处于运行状态
* 能接收到请求
* 分析请求内容
* 处理响应内容
* 发送响应内容到客户端
*
* @author Administrator
*
*/
public class Server
{
private int port = ;
/**
* 启动服务器
*/
public void start()
{
try
{
// 实例化一个服务器端Socket对象用于接收客户端的连接信息
ServerSocket server = new ServerSocket(port);
while(true)
{
// 接收到的socket对象中 包含了http请求信息
Socket socket = serveraccept();
Systemoutprintln(接收到一个请求!);
// 将socket对象交给线程类进行 单独的处理从而可以同时响应多个用户的请求
Processor p = new Processor(socket);
new Thread(p)start();
}
}
catch (IOException e)
{
eprintStackTrace();
}
}
/**
* 简单的服务器程序通过main方法来启动服务器
* @param args
*/
public static void main(String[] args)
{
new Server()start();
}
}
import javaioBufferedReader;
import javaioFile;
import javaioFileInputStream;
import javaioFileNotFoundException;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javaioOutputStream;
import javaioOutputStreamWriter;
import Socket;
/**
* Processor 用于接收请求内容分析请求内容处理响应发送响应
* @author Administrator
*
*/
public class Processor implements Runnable
{
private Socket socket;
// 定义虚拟服务器所在的根目录
// 当访问请求地址为
// 程序将读取并返回 WEB_ROOT\doc\l 文件的内容
private final static String WEB_ROOT = E:\\java学习\\web 作业\\浮动广告;
public Processor(Socket s)
{
thissocket = s;
}
@Override
public void run()
{
// 分析请求内容
String filePath = parse();
// 处理响应读取页面文件内容
String fileContent = readFile(filePath);
if(fileContent != null)
{
// 发送响应
sendResult( OK fileContent);
}
}
/**
* 解析请求内容根据请求中的URL内容获取请求对应的页面文件路径
* @return 页面相对路径
*/
public String parse()
{
try
{
InputStream in = socketgetInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String requestContent = readerreadLine();
// Systemoutprintln(requestContent);
String[] contents = requestContentsplit( );
String url = contents[];
// Systemoutprintln(url);
// inclose();
// readerclose();
return url;
}
catch (IOException e)
{
eprintStackTrace();
}
return null;
}
/**
* 根据传入的文件相对路径通过文件IO流读取内容并返回
* 如果没有找到文件发送错误响应
* @param filePath
* @return
*/
public String readFile(String filePath)
{
String absFilePath = WEB_ROOT + filePath;
File file = new File(absFilePath);
Systemoutprintln(filegetAbsolutePath() + 文件是否存在+fileexists());
// File IO流读取文件内容
if(fileexists())
{
try
{
byte[] buff = new byte[(int) filelength()];
FileInputStream fis = new FileInputStream(file);
fisread(buff);
String fileContent = new String(buff);
fisclose();
return fileContent;
}
catch (FileNotFoundException e)
{
eprintStackTrace();
}
catch (IOException e)
{
eprintStackTrace();
}
}
else
{
sendResult( File not found 你懂的!);
}
return null;
}
/**
* 通过响应发送响应内容
* @param errorCode
* @param errorMessage
*/
public void sendResult(int code String message String result)
{
// 通过socket对象的输出流 发送响应内容
try
{
OutputStream os = socketgetOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
oswwrite(HTTP/ + code + + message + \r\n);
oswwrite(ContentLength: + resultgetBytes()length + \r\n);
oswwrite(ContentType:text/html\r\n);
oswwrite(\r\n);
oswwrite(result);
oswflush();
oswclose();
}
catch (IOException e)
{
eprintStackTrace();
}
}
}