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

这个博客介绍了如何使用Java编写一个简单的Web服务器。通过WebServerDemo类,展示了如何处理HTTP请求,包括读取请求、响应文件或目录信息,并处理错误情况。示例代码中包含了处理GET请求、发送文件和目录列表的功能。
摘要由CSDN通过智能技术生成

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

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

Directory of ");

pw.print(req);

pw.print("

Directory of ");

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 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);

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值