Java 实现 web服务器的简单实例

网友投稿 225 2023-05-06


Java 实现 web服务器的简单实例

java 实现 web服务器的简单实例

实例代码:

import java.util.*;

// Chapter 8, Listing 3

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

pALlPaBuB 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("

pw.print(req);

pw.print("

pw.print(req);

pw.println("

File[] contents = dir.listFiles();

for (int i = 0; i < contents.length; i++) {

pw.print("

pw.print("

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("

pw.println("

}

pw.println("

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: " + 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 Serhttp://verSocket(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);

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mock工具 linux(mock工具线程不安全)
下一篇:ReadWriteLock接口及其实现ReentrantReadWriteLock方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~