- 浏览: 10397 次
最新评论
一个简单的异步http连接器iteye技术网站
2011年07月01日
前两天看了Tomcat连接器部分的源码,Tomcat 4默认的连接器随意已经过时了,但是是一个很好的学习工具。它里面用了多线程的机制使得HttpProcesor异步处理。我但是也是看了很长时间,最后大部分看懂了,但是还有很多没有看懂。我自己写了一个很简单的一个连接器HttpConnector,一个HttpProcessor,帮助大家理解它,先看看程序吧。
BootStrap类很简单,就是使得HttpConnector监听socket请求,这个很好理解。
public class BootStrap { public static void main(String[] args){ HttpConnector connector = new HttpConnector(); connector.start(); System.out.println("Server is started, listened in 9999!"); } }
下面是一个比较复杂的HttpConnector类,它首先会创建ServerSocket,然后启动线程,创建minProcessors个HttpProcesor,并使它们都启动起来。
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Stack; public class HttpConnector implements Runnable{ private ServerSocket serverSocket; private int minProcessors = 1; private int maxProcessors = 5; private int curProcessors = 0; private Stack processors = new Stack(); private boolean stopped = false; public void run() { try { while(!stopped){ Socket socket = serverSocket.accept(); HttpProcessor processor = createProcessor(); if(processor != null) { processor.assign(socket); } else { System.out.println("Socket is no resource to be handled!"); } socket.close(); } } catch (IOException e) { e.printStackTrace(); } } public void recycle(HttpProcessor processor){ processors.push(processor); } public void start(){ try { serverSocket = new ServerSocket(9999); } catch (IOException e) { e.printStackTrace(); } Thread thread = new Thread(this); thread.start(); while(curProcessors 0 && curProcessors >= maxProcessors){ break; } HttpProcessor processor = newProcessor(); processors.push(processor); } } private HttpProcessor newProcessor() { HttpProcessor processor = new HttpProcessor(this,curProcessors++); processor.start(); return processor; } private HttpProcessor createProcessor(){ synchronized(processors){ if(processors.size() > 0){ return processors.pop(); } else { if(maxProcessors > 0 && curProcessors < maxProcessors){ return newProcessor(); } else { if(maxProcessors < 0){ return newProcessor(); } else { return null; } } } } } }
下来一个是HttpProcessor,在线程启动后,会调用await方法,使得当前线程等待,有个Socket请求来临之后,调用assign方法,使得当前线程继续运行,但是assign方法会返回,HttpConnector就可以继续相应请求了。在HttpProcessor处理完了之后,HttpPrcoessor会重新放到栈中,就可以进行复用了。这个来的线程同步感觉看了很久还是明白了,但是我估计
现在还写不出来。
import java.net.Socket; public class HttpProcessor implements Runnable{ private HttpConnector connector; private int processorId; private Socket socket; private boolean avaliable = false; private boolean stopped = false; public HttpProcessor(HttpConnector connector, int processorId){ this.connector = connector; this.processorId = processorId; } public void run(){ while(!stopped){ Socket socket = await(); process(socket); connector.recycle(this); } } public void process(Socket socket){ System.out.println("Processor " + processorId + " Process socket :" + socket.getPort()); } public void start(){ Thread thread = new Thread(this); thread.start(); } public synchronized Socket await(){ while(!avaliable){ try { System.out.println("Process " + processorId + " is ready!"); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } avaliable = false; Socket socket = this.socket; notifyAll(); return socket; } public synchronized void assign(Socket socket){ while(avaliable){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } avaliable = true; this.socket = socket; notifyAll(); } }
最后贴上客户端程序,这个我们是来测试服务器端运行的,也很好理解。
import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args){ for(int i = 0; i < 100; i++){ Socket socket = null; try { socket = new Socket(InetAddress.getByName("127.0.0.1"),9999); System.out.println("Socket is started, socket id is:" + socket.getPort()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }
发表评论
-
[.net] 关于.net线程问题总结(二)
2012-01-20 00:50 613[.net] 关于.net线程问题总结(二) 2011年01 ... -
多进程与多线程区别
2012-01-20 00:50 576多进程与多线程区别 20 ... -
delphi 文件下载汇总
2012-01-20 00:50 931delphi 文件下载汇总 2011年03月22日 现在 ... -
JAVA RMI线程模型及内部实现机制
2012-01-20 00:50 697JAVA RMI线程模型及内部实现机制 2010年06月07 ... -
电脑高手应用技巧荟萃(电脑知识二十六)
2012-01-17 01:08 591电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07 ... -
电脑常见问题2
2012-01-17 01:08 625电脑常见问题2 2010年10 ... -
(9.26更新 老机福音,再创经典)Ghost_XP_战神 V9.5 老机优化版
2012-01-17 01:07 1049(9.26更新 老机福音,再创经典)Ghost_XP_战神 V ... -
安卓新手成长日记之Andriod系统基础知识普及
2012-01-17 01:07 628安卓新手成长日记之Andriod系统基础知识普及 2011年 ... -
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
2012-01-15 19:49 640什么是CGI、FastCGI、PHP-CG ... -
Android开机启动流程,IT爱好者必看
2012-01-15 19:49 500Android开机启动流程,IT爱好者必看 2011年11月 ... -
IP组播技术综述二
2012-01-15 19:49 550IP组播技术综述二 2011 ... -
Java加密和数字签名 5数字证书
2012-01-15 19:49 572Java加密和数字签名 5数 ... -
MySql 常用命令
2012-01-11 12:02 537MySql 常用命令 2011年07 ... -
情人节后的 JSF PrimeFaces2.0 更完美了!
2012-01-11 12:02 549情人节后的 JSF PrimeFaces2.0 更完美了! ... -
JS 动态添加事件
2012-01-11 12:02 499JS 动态添加事件 2011年07月01日 转:http ... -
转义符号启示-坚持-iteye技术网站
2012-01-11 12:02 348转义符号启示-坚持-iteye技术网站 2011年07月01 ...
相关推荐
NULL 博文链接:https://asialee.iteye.com/blog/548571
这是我在iteye网站的技术博客
深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站
eclipse开发环境(支持tomcat、maven、jetty、JBoss) - - ITeye技术网站
Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站
java_web开发_高并发处理_-_-_ITeye技术网站.pdf
NULL 博文链接:https://itshu.iteye.com/blog/1754672
MSSQL连接器.
NULL 博文链接:https://enefry.iteye.com/blog/986651
NULL 博文链接:https://jiangtie.iteye.com/blog/1003878
最新的ITeye月刊,覆盖各个It的行业最新信息,了解最新的咨询。
tomcat6使用DBCP和blob出现ClassCastException解决方法
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。:copyright: 20032017 ITey
自己存的一些网站,看过的一些技术类的文章,一些论坛
iteye.com 自动留言交友推广的小工具 博文链接:https://380071587.iteye.com/blog/1931124
Hibernate 缓存 深入 详解 ITEye
NULL 博文链接:https://webmaster.iteye.com/blog/2077436
NULL 博文链接:https://webmaster.iteye.com/blog/2092746
NULL 博文链接:https://webmaster.iteye.com/blog/2020351