Java web server 基本实现原理
public class WebServer {
//服务端Socket只要一个,所以定义成static, 同一时间只能一个线程访问(主线程)
private static ServerSocket ss;
public static void main(String[] args) throws IOException {
//绑定端口,只会执行一次
ss = new ServerSocket(8999); //远端服务器使用ServerSocket技术打开一个端口,等待请求的到来
//主线程永远不死,所以用了个死循环
while (true) {
//这是一个IO阻塞式语句,也就是如果没有请求(IO操作)进来,当前线程会在此等待,不再向下执行
Socket socket = ss.accept();
// socket:(本机IP+ 本机端口 +服务端IP+ 服务端端口,用来唯一标示一条TCP联接)通道
//得到请求报文(内容)
StringBuffer sb = new StringBuffer();
PrintWriter pw = null;
try {
InputStream socketIn = socket.getInputStream(); //从通道socket上获得流
BufferedReader br = new BufferedReader(new InputStreamReader(socketIn));
while(true) {
String msg = br.readLine();
sb.append(msg);
System.out.println(msg);
if (msg == null || msg.trim().equals("")) {
break;
}
}
//输入响应报文
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
// 所发送HTTP数据包
pw.println("HTTP/1.1 200 OK");
pw.println("Content-Type: text/html;charset=UTF-8");
pw.println();
pw.write("html");
pw.flush();
} catch (IOException exception) {
//TODO 处理异常
} finally {
socket.close();
pw.close();
//socket = null;
}
}
}
}
servlet 是单例的 只初始化一次
可以在Web.xml中配置
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
然后在servlet的init函数中获得参数
config.getInitParameter();
publicclass
WebServer {
//服务端Socket只要一个,所以定义成static,
同一时间只能一个线程访问(主线程)
privatestatic
ServerSocket ss;
publicstaticvoid
main(String[] args) throws
IOException {
//绑定端口,只会执行一次
ss
= new
ServerSocket(8999);
//主线程永远不死,所以用了个死循环
while
(true)
{
//这是一个IO阻塞式语句,也就是如果没有请求(IO操作)进来,当前线程会在此等待,不再向下执行
Socket
socket = ss.accept();
//得到请求报文(内容)
StringBuffer
sb = new
StringBuffer();
PrintWriter
pw = null;
try
{
InputStream
socketIn = socket.getInputStream();
BufferedReader
br = new
BufferedReader(new
InputStreamReader(socketIn));
while(true)
{
String
msg = br.readLine();
sb.append(msg);
System.out.println(msg);
if
(msg == null
|| msg.trim().equals(""))
{
break;
}
}
//输入响应报文
pw
= new
PrintWriter(new
OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
pw.println("HTTP/1.1
200 OK");
pw.println("Content-Type:
text/html;charset=UTF-8");
pw.println();
pw.write("html");
pw.flush();
}
catch
(IOException exception) {
//TODO处理异常
}
finally
{
socket.close();
pw.close();
//socket
= null;
}
}
}
}
Java web server 基本实现原理的更多相关文章
- Java Web文件上传原理分析(不借助开源fileupload上传jar包)
Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web 最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...
- tiny java web server
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; ...
- Java Web 开发的JavaBean + Servlet + Sql Server
日期:2018.12.9 博客期:026 星期日 我知道对于每个人都需要对开发web进行了解,而我们常用的技术,也应该有所了解 /*<------------------->*/知识点: ...
- Java Web项目实战第1篇之环境搭建
写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...
- JAVA Web学习笔记
JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...
- [置顶] Embedded Server:像写main函数一样写Web Server
1.传统的JEE Web Server 传统的JEE中,如果我们想要部署一个Web Application,我们需要首先安装一个Container Server,如JBoss,WebLogic,Tom ...
- JAVA WEB快速入门之环境搭建
前言 我是一直致力于:.NET技术栈.WEB前端.架构设计相关的开发与管理工作,但因国内大环境影响及公司技术方向发生转变(由.NET全部转为JAVA),需要熟练掌握JAVA WEB相关的知识,故我也得 ...
- Tomcat是怎么工作的(2) -- 动手实现山寨版的简单Web Server
本文先讲解一下Java web server都是怎么工作的.web server也叫HTTP server——顾名思义它是用HTTP协议和客户端交互的.客户端一般就是各种各样的浏览器了.相信所有朋友都 ...
- Java Web程序工作原理
Web开发的最重要的基本功能是HTTP:Java Web开发的最重要的基本功是Servlet Specification.HTTP和Servlet Specitication对于Web Server和 ...
随机推荐
- [USACO17JAN] 晋升者计数 dfs序+树状数组
[USACO17JAN] 晋升者计数 dfs序+树状数组 题面 洛谷P3605 题意:一棵有点权的树,找出树中所有\((u,v)\)的对数,其中\(u,v\)满足\(val(u)\le val(v)\ ...
- 推荐 | Vue 入门&进阶路线
今儿跟大家聊聊 Vue . 不得不承认, Vue 越来越受欢迎了.对比 Angular 和 React,虽然三者都是非常优秀的前端框架,但从 GitHub 趋势看,Vue 已经排在第一位,达到了13万 ...
- jar包中的依赖jar版本冲突
背景,项目中之前引入了一个 图片上传的jar <groupId>commons-fileupload</groupId> <artifactId>commons-f ...
- 将String类型的字符串拼接成以逗号分隔的字符输出
package test; import java.util.ArrayList; import java.util.List; public class Tesdssss { private sta ...
- 重读APUE(12)-SIGCHLD与僵尸进程
SIGCHLD信号是当子进程终止时向父进程发送的信号:它的语义如下: 如果进程明确的将该信号设置为SIG_IGN,则调用进程不会产生僵尸进程:这种情况下,wait是等不到给子进程收尸的,所以wait阻 ...
- Linux设备驱动程序 之 内核定时器
综述 如果需要在将来的某个时间点调度执行某个动作,同时在该时间点到达之前不会阻塞当前进程,则可以使用内核定时器: 内核定时器是一个数据结构,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户 ...
- impdp导入报错ORA-39070:无法打开日志文件
>impdp test/123456@orcl directory=expnc_dir dumpfile=TEST.DMP full=y ORA-39002:操作无效 ORA39070:无法打开 ...
- elasticsearch-6.4.3 集群搭建
1.准备三台服务器,已安装好es. 2.修改服务集群配置如下 使用命令: vi elasticsearch.yml 如下: cluster.name: myes ###保证三台服务器节点集群名称相同 ...
- Python 自学笔记(三)
1.列表 1-1.什么是列表 列表的代码格式:teacher=['张三','李四','王五'] 这里的['张三','李四','王五'] 就是一个列表,一个列表需要用中括号[ ]把里面的各种数据框起来, ...
- 安装RabbitMQ管理插件失败
运行 rabbitmq-plugins.bat enable rabbitmq_management后提示失败信息 是因为erlang和RabbitMQ版本冲突导致