J2EE 写了好些年,各种web容器都多多少少用过,却从未想过基本的web server是如何实现的。网上的文章多重于实用,官方文档又过于繁杂,若非机缘巧合,又怎想得到,神秘的web server,实现起来竟是如此简单!
首先,创建一个线程类,每个线程独立处理一个web browser request:
import java.io.*;
import java.net.*;
class WebServerConnection extends Thread {
Socket connection;
public WebServerConnection(Socket connection) {
super();
this.connection = connection;
this.setName("Request No. " + this.getId());
}
@Override
public void run() {
Writer response = null;
try {
Thread.sleep(1000);
response = new OutputStreamWriter(connection.getOutputStream());
response.write(this.getName(), 0, this.getName().length());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
一个简单的请求处理器就这样完成了,它的动作很简单,对任何一个浏览器请求,它的回应都是自己的线程名。接下来要跑一个daemon进程,监听一切来自9090端口的请求,每到达一个请求,都创建一个WebServerConnection线程去处理,然后继续监听端口。该进程只能处理一共threadLimit那么多的请求,数量一到,server 宕掉:
import java.net.*;
public class WebServer {
public static void main(String[] args) {
try {
int threadLimit = 5;
int threadCounter = 0;
ServerSocket sock = new ServerSocket(9090);
while ((threadCounter++) < threadLimit) {
//阻塞进程,直到新的request被侦测到
Socket connection = sock.accept();
//创建处理线程
Thread connect = new WebServerConnection(connection);
connect.start();
}
System.out.println("limit reached, server down!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行WebServer,然后在浏览器里输入http://localhost:9090,怎样,看到线程名了不是?多刷几次试试?
分享到:
相关推荐
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
摘要:Java源码,初学实例,基于EJB的真实世界模型 基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME...
摘要:Java源码,初学实例,基于EJB的真实世界模型 基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...
凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...
代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
“企业开发人员”和 Web 设计人员将发现 JSF 开发可以简单到只需将用户界面 (UI) 组件拖放到页面上,而“系统开发人员”将发现丰富而强健的 JSF API 为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构建...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
1:集成最新,最流行,,最成熟悉的技术框架 springMVC4.1.4,spring4.1.4,mybaits3.2.8,MySQL5.6 2:前端界面采用当前最流行的响应式布局设计 bootstrap3,html5,CSS3,JQueryAjax 特点: 1:基于mybaits...
由于B/S架构管理软件只安装在服务器端(Server)上,即应用程序在部署、升级、维护时,只需要在服务器端进行配置就可以了,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过...
看不到源码船长——宇宙中最简单的服务发现 Captain 是另一个基于 redis 的服务发现实现。 为了简单和性能,Captain 牺牲了一点高可用性。 大多数情况下,我们没有几万台机器,机器崩溃的可能性非常低,高可用性并...
基于数据库和网络应用的考试系统有多种实现技术,可以采用传统的客户机/服务器(Client/server)模式,也可以采用目前流行的浏览器/服务器(Browser/Web)模式,即基于WEB的方式。 所谓Client/server模式。
java源码源码PhoneGap/Cordova 替代方案 - 将 Html5 应用程序打包到 Android/IOS 中的最简单方法 只需将 Html5App 的 zip 复制到 APK 的 assets/Apps 目录(区分大小写) 将要与Html5 App打包的APK复制到一个目录中 ...
一个不怎么智能,半手工方式的,但最适合实际开发的java代码生成器 核心理念: 为你生成一切,再根据所需手工copy回来工作区 用最精简的代码完成最核心的功能 特性 基于FreeMarker模板语言,并且模板易于修改 基于...
通用用户管理系统, 实现最常用的用户注册、登录、资料管理、个人中心、第三方登录等基本需求,支持扩展二次开发。 > zheng-wechat-mp 微信公众号管理平台,除实现官网后台自动回复、菜单管理、素材管理、用户管理...