如何用Java实现Web服务器

如何用Java实现Web服务器,第1张

如何用Java实现Web服务器 一、HTTP协议的作用原理

WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:

(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。

(2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:

GET 路径/文件名 HTTP/1.0

文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。

(3) 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。

可以把文件目录配置在web.xml文件的初始化参数中, 通过ServletAPI读取文件目录

比如

定义一个Properties文件保存相关配置

#可以上传文件的后缀名

extensions=pptx,docx.doc,txt,jpg,jar

#单个文件的大小1M

fileMaxSize=1048576

#总共上传文件大小5M

totalFileMaxSize=5242880

#文件保存路径

filePath=z:/temp

#临时文件路径

tempDir=z:/temp/temp

使用Listener在服务器启动时加载配置信息

1

2

3

4

5

6

7

8

9

10

11

ServletContext context = event.getServletContext()

InputStream inputStream = context

.getResourceAsStream("/WEB-INF/classes/file/upload/commons/uploadConfig.properties")

Properties properties = new Properties()

try {

properties.load(inputStream)

context.setAttribute("fileConfig", properties)

System.out.println("properties = " + properties.size())

} catch (IOException e) {

e.printStackTrace()

}

在你上传文件时通过配置文件读取路径保存

String filePath = ((Properties) this.getServletContext().getAttribute("fileConfig"))

.getProperty(FileUploadConstants.FILE_PATH)

我现写了一个,可以访问到静态资源。你看情况多给点分吧

另外eclipse还没有5.5,5.5的貌似是myEclipse吧

其中port指端口,默认是地址是http://127.0.0.1:8088/

其中basePath指资源根路径,默认是d:

可以通过命令行参数对其进行赋值

import java.io.BufferedReader

import java.io.ByteArrayOutputStream

import java.io.File

import java.io.FileInputStream

import java.io.IOException

import java.io.InputStreamReader

import java.io.OutputStream

import java.io.PrintStream

import java.net.ServerSocket

import java.net.Socket

import java.net.URLDecoder

public class SimpleHttpServer {

private static int port = 8088

private static String basePath = "D:/"

public static void main(String[] args) {

if (args.length >= 1) {

basePath = args[0]

}

if (args.length >= 2) {

port = Integer.parseInt(args[1])

}

System.out.println("server starting:")

System.out.println("base path:" + basePath)

System.out.println("Listening at:" + port)

startServer()

System.out.println("server started succesfully")

}

private static void startServer() {

new Thread() {

public void run() {

try {

ServerSocket ss = new ServerSocket(port)

while (true) {

final Socket s = ss.accept()

new Thread() {

public void run() {

try {

OutputStream socketOs = s.getOutputStream()

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()))

String line

String headerLine = null

while ((line = br.readLine()) != null) {

if (headerLine == null) {

headerLine = line

}

if ("".equals(line)) {

break

}

}

String target = headerLine.replaceAll("^.+ (.+) HTTP/.+$", "$1")

String queryString

String[] tmp = target.split("\\?")

target = URLDecoder.decode(tmp[0], "utf-8")

target = target.endsWith("/") ? target.substring(0, target.length() - 1) : target

if (tmp.length >1) {

queryString = tmp[1]

} else {

queryString = ""

}

String filePath = basePath + target

File f = new File(filePath)

if (!f.exists()) {

StringBuffer content = new StringBuffer()

content.append("<html><head><title>Resource Not Found</title></head><body><h1>The requested resource ")

.append(target).append(" is not found.</h1></body></html>")

StringBuffer toWrite = new StringBuffer()

toWrite.append("HTTP/1.1 404 Not Found\r\nContent-Length:").append("" + content.length()).append("\r\n\r\n")

.append(content)

socketOs.write(toWrite.toString().getBytes())

} else if (f.isDirectory()) {

StringBuffer content = new StringBuffer()

content.append("<html><head><title>").append(target).append(

"</title></head><body><table border='1' width='100%'>")

content.append("<tr><th align='left' width='40px'>").append("Path").append("</th><td>").append(target.length()>0?target:"/")

.append("</td></tr>")

content.append("<tr><th align='left'>Type</th><th align='left'>Name</th></tr>")

if (!basePath.equals(filePath)) {

content.append("<tr><td>Directory</td><td>").append("<a href='").append(

target.substring(0, target.lastIndexOf("/") + 1)).append("'>..</a>").append("</td></tr>")

}

File[] files = f.listFiles()

for (File file : files) {

content.append("<tr><td>")

if (file.isFile()) {

content.append("File</td><td>")

} else if (file.isDirectory()) {

content.append("Directory</td><td>")

}

content.append("<a href=\"").append(target)

if (!(target.endsWith("/") || target.endsWith("\\"))) {

content.append("/")

}

content.append(file.getName()).append("\">").append(file.getName()).append("</a></td></tr>")

}

content.append("</table></body></html>")

StringBuffer sb = new StringBuffer()

sb.append("HTTP/1.1 200 OK\r\nCache-Control: max-age-0\r\n")

sb.append("Content-Length:").append("" + content.length()).append("\r\n\r\n")

sb.append(content)

socketOs.write(sb.toString().getBytes())

} else if (f.isFile()) {

socketOs.write(("HTTP/1.1 200 OK\r\nCache-Control: max-age-0\r\nContent-Length:" + f.length() + "\r\n\r\n")

.getBytes())

byte[] buffer = new byte[1024]

FileInputStream fis = new FileInputStream(f)

int cnt = 0

while ((cnt = fis.read(buffer)) >= 0) {

socketOs.write(buffer, 0, cnt)

}

fis.close()

}

socketOs.close()

} catch (Exception e) {

try {

s.getOutputStream().write("HTTP/1.1 500 Error\r\n".getBytes())

ByteArrayOutputStream byteos = new ByteArrayOutputStream()

PrintStream printStream = new PrintStream(byteos)

printStream

.write("<html><head><title>Error 500</title></head><body><h1>Error 500</h1><pre style='font-size:15'>"

.getBytes())

e.printStackTrace(printStream)

printStream.write("</pre><body></html>".getBytes())

byteos.close()

byte[] byteArray = byteos.toByteArray()

s.getOutputStream().write(("Content-Length:" + byteArray.length + "\r\n\r\n").getBytes())

s.getOutputStream().write(byteArray)

s.close()

} catch (IOException e1) {

e1.printStackTrace()

}

}

}

}.start()

}

} catch (Exception e) {

e.printStackTrace()

}

}

}.start()

}

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/401412.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存