如何用Java实现Web服务器?
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我。。。
0条评论