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

WEB容器工作原理

市面上的javaweb容器常见的有两种,一种是jetty,一种是tomcat。要想用java实现web容器,首先要知道其工作原理。

以Tomcat为例,我们通常开发出来的war包,会放在tomcat中的webapp下面,tomcat会自动解压war包。解压完成后,其实就是一个servlet应用!换句话说,我们写的war包中的servlet应用只需要关注业务层面的,处理http等网络链接的事情交给都交给tomcat了,一个请求到达tomcat的流程:

所以其实我们也可以手写一个web容器,只要能接收请求并转发给相应的servlet请求即可。

手写一个小的web容器

整体结构大致如下

1、写一个处理网络请求连接请求实体类、一个和网络请求连接响应实体类

2、写一个容器主类,包括启动监听端口等

3、写容器的接口,以及注解相关的url附加类便于让应用servlet

4、写一个app测试servlet,类似tomcat中跑的war包

如果你监听的端口是8888,那么就可以访问localhost:8888/app,就可以测试了

结语

java写web容器,其实没什么难的,简单的写一下了解一下原理即可,真实工作中是不建议自己写的,有很多问题会考虑不周的。关于web容器网上也有很多例子,可以借鉴了解一下。祝你学习愉快。

场景:在家远程办公,使用***访问公司微服务, 浏览器能正常访问, 但java程序发起的请求不能

解决方法:加入java启动参数: -DjavanetpreferIPv4Stack=true

如果使用的是tomcat则在tomcat启动参数里面添加 -DjavanetpreferIPv4Stack=true

如果使用的是springboot则

https://blogcsdnnet/Yuwen_forJava/article/details/104293533

https://blogcsdnnet/fly910905/article/details/86222946

代码如下。。。我测试过了。。。。下面两个类是在同一台机器上进行测试的,先运行Serverjava,再运行Clientjava

import javaio;

import javanet;

import javatextSimpleDateFormat;

import javautilDate;

public class Server {

public static void main(String[] args) throws Exception{

ServerSocket ss = new ServerSocket(8080);

Socket socket = ssaccept();

BufferedReader in = //获取客户端发过来的消息

new BufferedReader(

new InputStreamReader(socketgetInputStream()));

PrintWriter out = //用于向客户端发送消息

new PrintWriter(

new OutputStreamWriter(

socketgetOutputStream()),true);

while(true){

String message = inreadLine();//读取消息

if("quit"equals(message))//退出命令

break;

String s[] = messagesplit("\\s+");

if("dir"equals(s[0])){

File dir = new File(s[1]);

File[] files = dirlistFiles();

//向客户端发送文件消息

for(File file:files){

Date date = new Date(filelastModified());

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//日期格式化

FileInputStream is = new FileInputStream(file);

outprintln(filegetName()+"\t"+dfformat(date)+"\t"+((isavailable()+1023)/1024)+"k");

}

outprintln("ok");

}

}

socketclose();

inclose();

outclose();

ssclose();

}

}

-------------------------------------------------------------------------------------------------------------

import javaio;

import javanet;

public class Client {

public static void main(String[] args) throws Exception{

InetAddress add = InetAddressgetByName(null);

Socket socket = new Socket(add,8080);

BufferedReader in = //获取服务器端发过来的消息

new BufferedReader(

new InputStreamReader(socketgetInputStream()));

PrintWriter out = //用于向服务器端发送消息

new PrintWriter(

new OutputStreamWriter(

socketgetOutputStream()),true);

outprintln("dir d:/test");

String mes;

while(true){

mes = inreadLine();

if("ok"equals(mes))

break;

Systemoutprintln(mes);

}

outprintln("quit");

socketclose();

inclose();

outclose();

}

}

希望能帮到你。。。仍有问题可以追问或者直接HI我。。。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何用Java实现Web服务器?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情