- 浏览: 687161 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 32641、扩展velocity的视图 [code=" ... -
【分布式系统工程实现】CAP理论及系统一致性
2013-03-08 16:05 1039印象中CAP理论开始流行 ... -
【分布式系统工程实现】分布式事务
2013-03-08 16:03 1392CAP理论虽然告诉我们,一致性和可用性二者不可兼得,但这并不 ... -
用消息队列和消息应用状态表来消除分布式事务
2013-03-08 16:01 1277由于数据量的巨大,大 ... -
使用MBean获取tomcat和jboss端口
2012-04-10 21:29 2679/** * 根据协议和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 1867<?xml version='1.0' encoding ... -
sql server2005备份还原
2011-09-22 11:29 9741、先建立一个同名数据库,停止SQL SERVER2005 ... -
apache mina开发文件传输服务器
2011-09-19 18:03 7741服务器接收端 /** * */ package o ... -
使用 Apache MINA 2 开发网络应用
2011-09-19 10:01 1173简介: Apache MINA 2 是一个开发高性能和高可伸缩 ... -
HTTP上传工具
2011-09-14 11:36 1871package com.dayo.tool; impor ... -
定义一个java类型转换器
2011-09-09 19:48 13661、相关接口 package org.liufei.jweb. ... -
Java获取客户端信息
2011-09-07 14:48 1656String agent = request.getHeade ... -
使用mina 作代理服务器例子
2011-09-07 14:38 2372import java.net.InetSocketAddre ... -
Java 通过 HTTP 下载文件
2011-09-07 14:35 1083package core.spider; import ... -
Java 的 HTTP 客户端 http4j 示例代码
2011-09-07 14:32 1474package com.google.code.http4j. ... -
获取IP地址
2011-09-07 13:41 2430public String getIpAddrByReques ... -
netty telnet 应用实例server代码
2011-09-07 12:21 1896public class TelnetServer { ... -
netty实现Socket NIO服务器
2011-09-06 15:58 8807package org.liufei.dccserver; ...
相关推荐
赠送jar包:netty-common-4.1.24.Final.jar; 赠送原API文档:netty-common-4.1.24.Final-javadoc.jar; 赠送源代码:netty-common-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-common-4.1.68.Final.jar; 赠送原API文档:netty-common-4.1.68.Final-javadoc.jar; 赠送源代码:netty-common-4.1....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-common-4.1.65.Final.jar; 赠送原API文档:netty-common-4.1.65.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:netty-common-4.1.65.Final.jar; 赠送原API文档:netty-common-4.1.65.Final-javadoc.jar; 赠送源代码:netty-common-4.1....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-common-4.1.23.Final.jar; 赠送原API文档:netty-common-4.1.23.Final-javadoc.jar; 赠送源代码:netty-common-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-common-4.1.73.Final.jar; 赠送原API文档:netty-common-4.1.73.Final-javadoc.jar; 赠送源代码:netty-common-4.1....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-common-4.1.11.Final.jar; 赠送原API文档:netty-common-4.1.11.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:netty-common-4.1.27.Final.jar; 赠送原API文档:netty-common-4.1.27.Final-javadoc.jar; 赠送源代码:netty-common-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:netty-transport-native-unix-common-4.1.68.Final.jar; 赠送原API文档:netty-transport-native-unix-common-4.1.68.Final-javadoc.jar; 赠送源代码:netty-transport-native-unix-common-4.1.68....
赠送jar包:netty-common-4.1.16.Final.jar; 赠送原API文档:netty-common-4.1.16.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:netty-common-4.1.11.Final.jar; 赠送原API文档:netty-common-4.1.11.Final-javadoc.jar; 赠送源代码:netty-common-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码
赠送jar包:netty-common-4.1.73.Final.jar; 赠送原API文档:netty-common-4.1.73.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
Netty 是一个高性能、...总之,“最新Netty中文文档CHM版”对于想要学习和使用Netty的开发者来说,是一份宝贵的参考资料,它可以帮助你快速理解Netty的工作原理,掌握其主要功能,从而在实际开发中发挥出Netty的潜力。
赠送jar包:netty-common-4.1.74.Final.jar; 赠送原API文档:netty-common-4.1.74.Final-javadoc.jar; 赠送源代码:netty-common-4.1....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
在本文中,我们将深入探讨Netty在实际应用中的实例——对象传递调用,以及如何解决TCP粘包问题。同时,我们还会讨论Java序列化方案在Netty中的编解码对比。 首先,让我们来看看TCP粘包问题。在TCP协议中,由于其...
赠送jar包:netty-common-4.1.27.Final.jar; 赠送原API文档:netty-common-4.1.27.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:netty-transport-native-unix-common-4.1.74.Final.jar; 赠送原API文档:netty-transport-native-unix-common-4.1.74.Final-javadoc.jar; 赠送源代码:netty-transport-native-unix-common-4.1.74....
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见...
赠送jar包:netty-common-4.1.16.Final.jar; 赠送原API文档:netty-common-4.1.16.Final-javadoc.jar; 赠送源代码:netty-common-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。