`
0428loveyu
  • 浏览: 29157 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

一个简单的Java服务器

 
阅读更多
/**
 * 
 */
package iotest.serversocket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Brandon B. Lin
 * 
 */
public class SingleFileHttpServer extends Thread {

	private byte[] content;
	private byte[] header;
	private int port = 80;

	public SingleFileHttpServer(String data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this(data.getBytes(encoding), encoding, MIMEType, port);
	}

	public SingleFileHttpServer(byte[] data, String encoding, String MIMEType,
			int port) throws UnsupportedEncodingException {
		this.content = data;
		this.port = port;
		createHeader(encoding, MIMEType);
	}

	private void createHeader(String encoding, String MIMEType)
			throws UnsupportedEncodingException {
		String header = "HTTP/1.0 200 OK\r\n" + "Server: OneFIle 1.0\r\n"
				+ "Content-length: " + content.length + "\r\n"
				+ "Content-type: " + MIMEType + "\r\n\r\n";
		this.header = header.getBytes(encoding);

	}

	@Override
	public void run() {
		try {
			ServerSocket server = new ServerSocket(port);
			log(server.getLocalPort());
			while (true) {
				respond(server);
			}
		} catch (IOException exception) {
			System.err.println("Could not start server. Port Occupied!");
		}
	}

	private void log(int port) {
		System.out.println("Accepting connection on port " + port);
		System.out.println("Data to be sent: ");
		try {
			System.out.write(content);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void respond(ServerSocket server) {
		Socket connection = null;
		try {
			connection = server.accept();
			String request = readRequestFromSocket(connection);
			boolean writeHeader = (request.toString().indexOf("HTTP/") != -1);
			writeToSocket(connection, writeHeader);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (connection != null)
				try {
					connection.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

	}

	private String readRequestFromSocket(Socket connection) throws IOException {
		InputStream in = new BufferedInputStream(connection.getInputStream());
		StringBuffer request = new StringBuffer(80);
		while (true) {
			int readByte = in.read();
			if (readByte == '\r' || readByte == '\n' || readByte == -1)
				break;
			request.append((char) readByte);
		}
		return request.toString();
	}

	private void writeToSocket(Socket connection, boolean writeHeader)
			throws IOException {
		OutputStream out = new BufferedOutputStream(
				connection.getOutputStream());
		if (writeHeader) {
			out.write(header);
		}
		out.write(content);
		out.flush();
	}

	public static void main(String[] args) {
		String fileName = "index.html";
		String contentType = "text/html";
		String encoding = "ASCII";
		int port = 80;

		byte[] data = readFileToByteArray(fileName);

		try {
			new SingleFileHttpServer(data, encoding, contentType, port).start();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

	}

	private static byte[] readFileToByteArray(String fileName) {

		byte[] data = null;
		try {
			InputStream in = new FileInputStream(fileName);
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			int readByte;
			while ((readByte = in.read()) != -1)
				out.write(readByte);
			data = out.toByteArray();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return data;

	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics