⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpserver.java

📁 精通Java网络编程代码全部
💻 JAVA
字号:
//HttpServer.java
//引入必要的包
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;
import java.util.StringTokenizer;
//类HttpServer从这里开始
public class HttpServer extends Thread { 
//继承自Thread,类HttpServer实现的Run()方法作为Http服务器的主控线程
//Http服务器的端口
	private final int HTTP_PORT;
//ServerSocket, 服务器通过这个ServerSocket接收来自Web客户的连接请求	
private ServerSocket listen = null;
//布尔变量,指示是否要继续运行
private boolean running = true;
//客户的请求和对相应请求的应答列表
	private Hashtable knownRequests = new Hashtable();

//构造函数,有一个参数port,指示Http服务器所在的端口
	public HttpServer(int port) {
		this.HTTP_PORT = port;
		//错误处理,端口号应该是大于零的整数
		if (this.HTTP_PORT <= 0) {
			System.err.println("HttpServer not started, as -Port is " + this.HTTP_PORT);
			return;
		}
		//此处将信息输出的System.err中,处于醒目的目的,在某些控制台上可以看到红色的输出
		System.err.println("Creating new HttpServer on Port = " + this.HTTP_PORT);
		//设置主线程为精灵线程
		setDaemon(true);
		//开始主控线程运行,此后可以接收来自客户的请求并处理
		start();
	}
//注册urlPath和data对,服务器从knowRequest表中匹配客户端的请求
//并将匹配的内容返回客户端
	public void registerRequest(String urlPath, String data) {
		System.out.println("Registering urlPath: " + urlPath + "=" + data);
		knownRequests.put(urlPath.trim(), data);
	}

	public void removeRequest(String urlPath) {
		knownRequests.remove(urlPath.trim());
	}
	//实现父类Thread的run方法
	public void run() {
		try {
			//创建ServerSocket的实例,ServerSocket绑定到HTTP_PORT端口
			this.listen = new ServerSocket(HTTP_PORT);
			//如果running标志为true,那么继续运行,否则主服务线程退出,服务结束
			while (running) {
				//接收来自客户端的TCP连接
				Socket accept = this.listen.accept();
				System.out.println("New incoming request on Port=" + HTTP_PORT + " ...");
				if (!running) {
					System.out.println("Closing http server Port=" + HTTP_PORT + ".");
					break;
				}
				//创建一个服务线程,为这个连接服务
				//为了同时为多个WEB客户服务,不能在这里就为客户服务
				//创建类HandlerRequest的实例,HandlerRequest也是Thread类的子类
				//HandlerRequset为accept所代表的客户端与本地的TCP连接服务
				//当HandlerRequest向客户端发回响应后,它所创建的线程也将结束
				HandleRequest hh = new HandleRequest(accept, knownRequests);
			}
		// 处理在服务过程中发生的异常
		} catch (java.net.BindException e) {
			System.out.println(
				"HTTP server problem, Port "
					+ listen.getInetAddress().toString()
					+ ":"
					+ HTTP_PORT
					+ " is not available: "
					+ e.toString());
		} catch (java.net.SocketException e) {
			System.out.println(
				"Socket "
					+ listen.getInetAddress().toString()
					+ ":"
					+ HTTP_PORT
					+ " closed successfully: "
					+ e.toString());
		} catch (IOException e) {
			System.out.println("HTTP server problem on port : " + HTTP_PORT + ": " + e.toString());
		}
		// 主循环结束,线程将要退出,做清扫工作
		if (this.listen != null) {
			try {
				//关闭套接字
				this.listen.close();
			} catch (java.io.IOException e) {
				System.out.println("this.listen.close()" + e.toString());
			}
			this.listen = null;
		}
	}
	// 可以调用这个方法停止HttpServer的服务
	public void shutdown()
	{
		System.out.println("Entering shutdown");
		//设置标志,通知主服务线程不再为新连接服务
		running = false;
		try {
			// 关闭套接字
			if (this.listen != null) {
				this.listen.close();
				this.listen = null;
			}
		} catch (java.io.IOException e) {
			System.out.println("shutdown problem: " + e.toString());
		}
	}

//主程序的入口
	public static void main(String[] args) {
		//创建一个HttpServer的实例,使用8888端口
		HttpServer server = new HttpServer(8888);
		//当客户端请求的url是”/Hello”时,返回”Hello World from MiniHttpServer!”
		server.registerRequest("/Hello", "Hello World from MiniHttpServer!");
		// 按任意建退出程序
		System.out.println("Press any key to exit...");
		try {
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -