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

📄 webserverdemo.java

📁 FetchURL.java 连接指定URL
💻 JAVA
字号:
import java.io.*;
import java.net.*;
import java.util.*;


public class WebServerDemo
{
	// Directory of HTML pages and other files 
	protected String docroot;
	// Port number of web server
	protected int port;
	// Socket for the web server
	protected ServerSocket ss;

	// Handler for a HTTP request
	class Handler extends Thread
	{
		protected Socket socket;
		protected PrintWriter pw;
		protected BufferedOutputStream bos;
		protected BufferedReader br;
		protected File docroot;

		public Handler(Socket _socket, String _docroot) throws Exception
		{
			socket=_socket;
			// Get the absolute directory of the filepath
			docroot=new File(_docroot).getCanonicalFile();
		}

		public void run()
		{
			try
			{
				// Prepare our readers and writers
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				bos = new BufferedOutputStream(socket.getOutputStream());
				pw = new PrintWriter(new OutputStreamWriter(bos));

				// Read HTTP request from user (hopefully GET /file...... )
				String line = br.readLine();

				// Shutdown any further input
				socket.shutdownInput();

				if(line == null)
				{
					socket.close();
					return;
				}
				if(line.toUpperCase().startsWith("GET"))
				{
					// Eliminate any trailing ? data, such as for a CGI GET request
					StringTokenizer tokens = new StringTokenizer(line," ?");
					tokens.nextToken();
					String req = tokens.nextToken();

					// If a path character / or \ is not present, add it to the document root
					// and then add the file request, to form a full filename
					String name;
					if(req.startsWith("/") || req.startsWith("\\"))
						name = this.docroot+req;
					else
						name = this.docroot+File.separator+req;

					// Get absolute file path
					File file = new File(name).getCanonicalFile();

					// Check to see if request doesn't start with our document root ....
					if(!file.getAbsolutePath().startsWith(this.docroot.getAbsolutePath()))
					{
						pw.println("HTTP/1.0 403 Forbidden");
						pw.println();
					}
					// ... if it's missing .....
					else if(!file.exists())
					{
						pw.println("HTTP/1.0 404 File Not Found");
						pw.println();
					}
					// ... if it can't be read for security reasons ....
					else if(!file.canRead())
					{
						pw.println("HTTP/1.0 403 Forbidden");
						pw.println();
					}
					// ... if its actually a directory, and not a file ....
					else if(file.isDirectory())
					{
						sendDir(bos,pw,file,req);
					}
					// ... or if it's really a file
					else
					{
						sendFile(bos, pw, file.getAbsolutePath());
					}
				}
				// If not a GET request, the server will not support it
				else
				{
					pw.println("HTTP/1.0 501 Not Implemented");
					pw.println();
				}

				pw.flush();
				bos.flush();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			try
			{
				socket.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
	 	}

		protected void sendFile(BufferedOutputStream bos, PrintWriter pw, String filename) throws Exception
		{
			try
			{
				java.io.BufferedInputStream bis = new java.io.BufferedInputStream(new FileInputStream(filename));
				byte[] data = new byte[10*1024];
				int read = bis.read(data);

				pw.println("HTTP/1.0 200 Okay");
				pw.println();
				pw.flush();
				bos.flush();

				while(read != -1)
				{
					bos.write(data,0,read);
					read = bis.read(data);
				}
				bos.flush();
			}
			catch(Exception e)
			{
				pw.flush();
				bos.flush();
			}
		}

		protected void sendDir(BufferedOutputStream bos, PrintWriter pw, File dir, String req) throws Exception
		{
			try
			{
				pw.println("HTTP/1.0 200 Okay");
				pw.println();
				pw.flush();

				pw.print("<html><head><title>Directory of ");
				pw.print(req);
				pw.print("</title></head><body><h1>Directory of ");
				pw.print(req);
				pw.println("</h1><table border=\"0\">");

				File[] contents=dir.listFiles();

				for(int i=0;i<contents.length;i++)
				{
					pw.print("<tr>");
					pw.print("<td><a href=\"");
					pw.print(req);
					pw.print(contents[i].getName());
					if(contents[i].isDirectory())
						pw.print("/");
					pw.print("\">");
					if(contents[i].isDirectory())
						pw.print("Dir -> ");
					pw.print(contents[i].getName());
					pw.print("</a></td>");
					pw.println("</tr>");
				}
				pw.println("</table></body></html>");
				pw.flush();
			}
			catch(Exception e)
			{
				pw.flush();
				bos.flush();
			}
		}
	}

	// Check that a filepath has been specified and a port number
	protected void parseParams(String[] args) throws Exception
	{
		switch(args.length)
		{
			case 1:
			case 0:
				System.err.println ("Syntax: <jvm> "+this.getClass().getName()+" docroot port");
				System.exit(0);

			default:
				this.docroot = args[0];
				this.port = Integer.parseInt(args[1]);
				break;
		}
	}

	public WebServerDemo(String[] args) throws Exception
	{
		System.out.println ("Checking for paramters");
	
		// Check for command line parameters
		parseParams(args);

		System.out.print ("Starting web server...... ");
	
		// Create a new server socket
		this.ss = new ServerSocket(this.port);

		System.out.println ("OK");

		for (;;)
		{
			// Accept a new socket connection from our server socket
			Socket accept = ss.accept();

			// Start a new handler instance to process the request
			new Handler(accept, docroot).start();
		}
	}

	// Start an instance of the web server running
	public static void main(String[] args) throws Exception
	{
		WebServerDemo webServerDemo = new WebServerDemo(args);
	}
}

⌨️ 快捷键说明

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