- 浏览: 693791 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
/** * 用Netty来实现上传 */ public class NettyFileUpload extends FileUpload { private NettyRequestContext context; public static final boolean isMultipartContent(HttpRequest request) { if (HttpMethod.POST != request.getMethod()) { return false; } if (request.getHeaders("Content-Type") == null && request.getHeaders("Content-Type").size() == 0) { return false; } String contentType = request.getHeaders("Content-Type").get(0); if (contentType == null) { return false; } if (contentType.toLowerCase().startsWith("multipart/")) { return true; } return false; } public NettyFileUpload(NettyRequestContext context) { this.context = context; } public NettyFileUpload(FileItemFactory fileItemFactory) { super(fileItemFactory); } public FileItemIterator getItemIterator() throws FileUploadException, IOException { return super.getItemIterator(context); } } public class NettyRequestContext implements RequestContext { private String encoding; private String contentType; private int contentLength = -1; /** * 上传的内容流 */ private InputStream inputStream; public NettyRequestContext(String encoding, String contentType, int contentLength, InputStream inputStream) { this.encoding = encoding; this.contentType = contentType; this.contentLength = contentLength; this.inputStream = inputStream; } @Override public String getCharacterEncoding() { return encoding; } @Override public String getContentType() { return contentType; } @Override public int getContentLength() { return contentLength; } @Override public InputStream getInputStream() throws IOException { // 不能直接用request的流,因为有HttpChunk return inputStream; } @Override public String toString() { return "ContentLength=" + this.getContentLength() + ", ContentType=" + this.getContentType(); } public void closeInputStream() throws IOException { getInputStream().close(); } } public class NettyChunkInputStream extends InputStream { private BlockingQueue<HttpChunk> chunkQueue = new ArrayBlockingQueue<HttpChunk>(128); private HttpChunk currentChunk = null; private volatile boolean closed; public boolean putChunk(HttpChunk chunk) throws IOException { if (!closed) { try { chunkQueue.put(chunk); } catch (InterruptedException e) { throw new IOException(e); } return true; } throw new IOException(" this inputstream has been closed!"); } @Override public int read() throws IOException { byte resultByte = -1; try { if (getChunk().getContent().readable()) { resultByte = getChunk().getContent().readByte(); } else if (!getChunk().isLast()) { nextChunk(); if (getChunk().getContent().readable()) { resultByte = getChunk().getContent().readByte(); } else { return -1; } } else { return -1; } } catch (InterruptedException e) { throw new IOException(e); } // InputStream.read()返回0-255之间的int return resultByte >= 0 ? resultByte : 256 + resultByte; } private HttpChunk getChunk() throws InterruptedException { if (currentChunk == null) { currentChunk = chunkQueue.take(); } return currentChunk; } private void nextChunk() throws InterruptedException { currentChunk = chunkQueue.take(); } @Override public int available() throws IOException { throw new UnsupportedOperationException("unsupport available()"); } @Override public void close() throws IOException { chunkQueue = null; closed = true; } public boolean isClosed() { return closed; } }
应用:
public class NettyUploadHandler extends SimpleChannelUpstreamHandler { private static ExecutorService EXECUTOR = Executors.newFixedThreadPool(32); private boolean hasReadChunk; private NettyChunkInputStream chunkStream = new NettyChunkInputStream(); private NettyRequestContext context; private volatile Map<String, String> resultMap = null; @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { if (!hasReadChunk) { handleHttpRequest(ctx, e); } else { handleHttpChunk(e); } } private void handleHttpRequest(ChannelHandlerContext ctx, MessageEvent e) throws IOException { HttpRequest request = (HttpRequest) e.getMessage(); if (isUploadFile(request)) { handleUploadRequest(request); } else { ctx.sendUpstream(e); } } private void handleUploadRequest(HttpRequest request) throws IOException { context = new NettyRequestContext("UTF-8", request.getHeader("Content-Type"), -1, chunkStream); if (request.isChunked()) { hasReadChunk = true; } else { HttpChunk chunk = new DefaultHttpChunk(request.getContent()); chunkStream.putChunk(chunk); } startUpload(); } private void handleHttpChunk(MessageEvent e) throws IOException { if (isUploadFinished()) { writeResult(e.getChannel()); return; } HttpChunk chunk = (HttpChunk) e.getMessage(); chunkStream.putChunk(chunk); if (chunk.isLast()) { for (;;) { if (isUploadFinished()) { writeResult(e.getChannel()); return; } } } } private boolean isUploadFinished() { return resultMap != null || chunkStream.isClosed(); } private boolean isUploadFile(HttpRequest request) { return request.getUri().equals("/upload/uploadfile") && NettyFileUpload.isMultipartContent(request); } private void startUpload() { EXECUTOR.execute(new UploadTask()); } private void writeResult(Channel channel) { String json = JsonUtil.beanToJson(resultMap); byte[] data = json.getBytes(); ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(data); HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); response.setContent(buffer); response.setHeader(HttpHeaders.Names.CONTENT_TYPE, "text/html; charset=UTF-8"); response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, String.valueOf(buffer.readableBytes())); channel.write(response); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { e.getCause().printStackTrace(); } class UploadTask implements Runnable { public UploadTask() { super(); } @Override public void run() { long start = System.currentTimeMillis(); try { NettyFileUpload upload = new NettyFileUpload(context); FileItemIterator iter = upload.getItemIterator(); while (iter.hasNext()) { FileItemStream item = iter.next(); //这里处理逻辑 } resultMap = handler.getResult(); context.closeInputStream(); long end = System.currentTimeMillis(); System.out.println("spend time : " + (end - start)); } catch (Exception e) { e.printStackTrace(); } } } }
该NettyChunkInputStream必须一个线程来putChunk(...),另一个线程使用getInputStream()来消耗数据。
PS:可以在NettyChunkInputStream中重写InputStream.read(bs,offset,len),避免每次调用read()都进行边界判断,使之效率更高。
评论
2 楼
landy8530
2013-04-09
请问一下,JsonUtil这个工具类是哪个jar包的?
1 楼
landy8530
2013-04-09
你好,可以给我一个完整的源码吗?因为最近刚研究netty,谢谢。
发表评论
-
Spring MVC集成velocity扩展
2013-07-23 17:18 32971、扩展velocity的视图 [code=" ... -
【分布式系统工程实现】CAP理论及系统一致性
2013-03-08 16:05 1059印象中CAP理论开始流行 ... -
【分布式系统工程实现】分布式事务
2013-03-08 16:03 1421CAP理论虽然告诉我们,一致性和可用性二者不可兼得,但这并不 ... -
用消息队列和消息应用状态表来消除分布式事务
2013-03-08 16:01 1295由于数据量的巨大,大 ... -
使用MBean获取tomcat和jboss端口
2012-04-10 21:29 2701/** * 根据协议和scheme获取服务端口号 ... -
淘宝网架构概述
2011-12-14 19:45 72众所周知,淘宝网是一 ... -
淘宝网的HttpClient工具
2011-11-23 21:02 47package com.taobao.pegasus.comm ... -
在Tomcat中通过JOTM支持JTA
2011-11-04 15:57 1900<?xml version='1.0' encoding ... -
sql server2005备份还原
2011-09-22 11:29 9921、先建立一个同名数据库,停止SQL SERVER2005 ... -
apache mina开发文件传输服务器
2011-09-19 18:03 7769服务器接收端 /** * */ package o ... -
使用 Apache MINA 2 开发网络应用
2011-09-19 10:01 1215简介: Apache MINA 2 是一个开发高性能和高可伸缩 ... -
HTTP上传工具
2011-09-14 11:36 1894package com.dayo.tool; impor ... -
定义一个java类型转换器
2011-09-09 19:48 13971、相关接口 package org.liufei.jweb. ... -
Java获取客户端信息
2011-09-07 14:48 1676String agent = request.getHeade ... -
使用mina 作代理服务器例子
2011-09-07 14:38 2402import java.net.InetSocketAddre ... -
Java 通过 HTTP 下载文件
2011-09-07 14:35 1104package core.spider; import ... -
Java 的 HTTP 客户端 http4j 示例代码
2011-09-07 14:32 1516package com.google.code.http4j. ... -
获取IP地址
2011-09-07 13:41 2455public String getIpAddrByReques ... -
netty telnet 应用实例server代码
2011-09-07 12:21 1923public class TelnetServer { ... -
netty实现Socket NIO服务器
2011-09-06 15:58 8944package org.liufei.dccserver; ...
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip