要研究http服务器,我们先从一个简单的服务器开始,无论接收什么请求,这个服务器都始终发送同一个文件。接收文件名、端口、内容编码等。
package com.hq.socket;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 接收文件名、端口、内容编码等。
* @author zzj
* @date Jul 15, 2016 9:13:27 AM
*/
public class SimpleFileHttpServer {
private final byte[] contet;
private final byte[] header;
private final int port;
private String encoding;
/**
* 开启服务器 向用户发送文件(同一个指定的文件)
* @param args 发送文件
* @author zzj
*/
public static void main(String[] args) {
String pathname="C:\\Users\\wb20160611\\Desktop\\pdf\\uploadFile.txt";
try {
FileInputStream fileInputStream = new FileInputStream(new File(pathname));
int a=0;
StringBuilder data = new StringBuilder();
while((a=fileInputStream.read())!=-1){
data.append((char)a);
}
SimpleFileHttpServer server = new SimpleFileHttpServer(data.toString(),"utf-8","",23);
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param contet
* @param header
* @param port
* @param encoding
* @throws UnsupportedEncodingException
*/
public SimpleFileHttpServer(String data, String encoding,String mimeType, int port) throws UnsupportedEncodingException {
this(data.getBytes(encoding),encoding,mimeType,port);
}
public SimpleFileHttpServer( byte[] contet, String encoding,String mimeType, int port) {
this.contet=contet;
this.encoding=encoding;
this.port=port;
String header="HTTP/1.0 200 OK\r\n"
+"Server:OneFile 2.0\r\n"
+"Content-length:"+this.contet.length+"\r\n"
+"Content-type:"+mimeType+";charset:"+encoding+"\r\n";
this.header=header.getBytes(Charset.forName("US-ASCII"));
}
public void start(){
ExecutorService executorService = Executors.newFixedThreadPool(10);
ServerSocket socketServer = null;
while(true){
try {
socketServer = new ServerSocket(this.port);//er
Socket connection = socketServer.accept();
executorService.submit(new FileOperatorThread(connection));
} catch (Exception e) {
e.printStackTrace();
}
}
}
//接收文件线程
class FileOperatorThread implements Callable<Boolean>{
private Socket connection;
public FileOperatorThread(Socket con){
this.connection=con;
}
/* (non-Javadoc)
* @see java.util.concurrent.Callable#call()
*/
@Override
public Boolean call() throws Exception {
try {
//得到输出流,读取输入流
OutputStream outputStream = this.connection.getOutputStream();
InputStream inputStream = this.connection.getInputStream();
//只读取第一行 包含请求的方法 请求的资源 协议等
StringBuilder request = new StringBuilder();
while(true){
System.out.println("...................");
int c = inputStream.read();
if (c=='\r' || c=='\n' || c==-1) {
break;
}
request.append((char)c);
}
if (request.toString().indexOf("HTTP")!=-1) {
outputStream.write(header);
}
outputStream.write(contet);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
if (connection!=null) {
connection.close();
}
}
return true;
}
}
}