- 浏览: 347895 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
18215361994:
chrome扩展中可以获取开发者工具所有资源不?
Chrome 插件开发 -
lBovinl:
完全是一头雾水~o(︶︿︶)o 唉
乱七八糟的Ruby笔记 -
zhangyanan_it:
楼主总结的好多!想问下:map.resources :role ...
Rails随记 -
justin_chiang:
...
Propertiess资源文件的读取和简单的性能测试 -
lezi2012:
感谢分享!!!感谢分享!!!感谢分享!!!感谢分享!!!感谢 ...
Rails随记
随便了解了下,也用搜到的代码理解了一下,稍微做了一些修改
比较底层的一些类有
package com.orz.gen; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.*; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.HashMap; import java.util.Iterator; import java.util.Set; /** * Created by IntelliJ IDEA. * User: felix * Date: 2010-5-11 * Time: 13:45:31 */ public class GemClass { int port = 12345; int BUFFERSIZE = 1024; Selector selector = null; ServerSocketChannel serverChannel = null; HashMap<SocketChannel, ClientChInstance> clientChannelMap = null;//用来存放每一个客户连接对应的套接字和通道 public GemClass(int port) { this.clientChannelMap = new HashMap<SocketChannel, ClientChInstance>(); this.port = port; } public void initialize() throws IOException { //初始化,分别实例化一个选择器,一个服务器端可选择通道 this.selector = Selector.open(); this.serverChannel = ServerSocketChannel.open(); this.serverChannel.configureBlocking(false); InetAddress localhost = InetAddress.getLocalHost(); InetSocketAddress isa = new InetSocketAddress(localhost, this.port); this.serverChannel.socket().bind(isa);//将该套接字绑定到服务器某一可用端口 } //结束时释放资源 public void finalize() throws IOException { this.serverChannel.close(); this.selector.close(); } //将读入字节缓冲的信息解码 public String decode(ByteBuffer byteBuffer) throws CharacterCodingException { Charset charset = Charset.forName("UTF-8"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(byteBuffer); return charBuffer.toString(); } //监听端口,当通道准备好时进行相应操作 public void portListening() throws IOException, InterruptedException { //服务器端通道注册OP_ACCEPT事件 SelectionKey acceptKey = this.serverChannel.register(this.selector, SelectionKey.OP_ACCEPT); //当有已注册的事件发生时,select()返回值将大于0 while (selector.select() > 0) { System.out.println("event happened"); //取得所有已经准备好的所有选择键 Set<SelectionKey> readyKeys = this.selector.selectedKeys(); //使用迭代器对选择键进行轮询 Iterator<SelectionKey> i = readyKeys.iterator(); while (i.hasNext()) { SelectionKey key = i.next(); i.remove();//删除当前将要处理的选择键 if (key.isAcceptable()) {//如果是有客户端连接请求 System.out.println("more client connect in!"); ServerSocketChannel nextReady = (ServerSocketChannel) key.channel(); //获取客户端套接字 SocketChannel s = nextReady.accept(); //设置对应的通道为异步方式并注册感兴趣事件 s.configureBlocking(false); //SelectionKey readWriteKey =s.register(this.selector,SelectionKey.OP_READ); //将注册的事件与该套接字联系起来 //readWriteKey.attach(s); s.register(selector,SelectionKey.OP_READ); //将当前建立连接的客户端套接字及对应的通道存放在哈希表//clientChannelMap中 this.clientChannelMap.put(s, new ClientChInstance(s)); } else if (key.isReadable()) {//如果是通道读准备好事件 System.out.println("Readable"); //取得选择键对应的通道和套接字 //SelectableChannel nextReady = key.channel(); SocketChannel channel = (SocketChannel) key.channel(); //处理该事件,处理方法已封装在类ClientChInstance中 this.readFromChannel(channel,clientChannelMap.get(channel)); } else if (key.isWritable()) {//如果是通道写准备好事件 System.out.println("writeable"); //取得套接字后处理,方法同上 SocketChannel channel = (SocketChannel)key.channel(); this.writeToChannel(channel, "This is from server!"); } } } } //对通道的写操作 public void writeToChannel(SocketChannel channel, String message) throws IOException { ByteBuffer buf = ByteBuffer.wrap(message.getBytes()); int nbytes = channel.write(buf); SelectableChannel ss; } //对通道的读操作 public void readFromChannel(SocketChannel channel, ClientChInstance clientInstance) throws IOException, InterruptedException { ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFERSIZE); int nbytes = channel.read(byteBuffer); byteBuffer.flip(); String result = this.decode(byteBuffer); //当客户端发出”@exit”退出命令时,关闭其通道 if (result.indexOf("@exit") >= 0) { channel.close(); } else { clientInstance.append(result); //读入一行完毕,执行相应操作 if (result.indexOf("\n") >= 0) { System.out.println("client input: " + result); clientInstance.execute(); } } } //该类封装了怎样对客户端的通道进行操作,具体实现可以通过重载execute()方法 public class ClientChInstance { SocketChannel channel; StringBuffer buffer = new StringBuffer(); public ClientChInstance(SocketChannel channel) { this.channel = channel; } public void execute() throws IOException { String message = "This is response after reading from channel!"; writeToChannel(this.channel, message); buffer = new StringBuffer(); } //当一行没有结束时,将当前字窜置于缓冲尾 public void append(String values) { buffer.append(values); } } //主程序 public static void main(String[] args) { GemClass nbServer = new GemClass(12345); try { nbServer.initialize(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } try { nbServer.portListening(); } catch (Exception e) { e.printStackTrace(); } } }
比较底层的一些类有
ServerSocketChannel //用于表示服务器,可以bind服务端地址和端口,关键在于使用accept()开启新的socket连接 SocketChannel; //代表一个socket连接的实例,在例子中使用了Map进行保存引用,进而复用,如保存交互记录等操作 Selector; //比较关键和比较难理解的一个地方,用于管理一组基于注册机制的连接对象,通过select()进行循环监听,在其下的连接对象发起新的事件时,响应并允许进行相应的自定义操作,使用selectedKeys表示所注册的子对象 SelectionKey; //配合Selector使用,用于表示一个或一组selector的类型,读/写/请求,比较抽象的包括了一个连接或者一个服务的类型(PS:比较纠结),因此也常需要进行强制向下转换.常用的方法有:channel(),attach(); 两个分别为关联的channel和所附带的对象,后者可能也可以用于保存一个数据. 这个例子忽略了线程安全带来的问题,可以直接使用telnet ip port进行测试,但如果涉及到服务端write操作,代码还需要调整,否则会有死循环产生!
发表评论
-
Android shell 创建 模拟器
2010-10-29 19:17 15541: 首先 下载sdk,并且配置合适的环境变量 ~/.bash ... -
使用maven+cargo远程发布应用
2010-10-27 15:04 1988感觉它还是依赖tomcat本身提供的web服务进行发布,所 ... -
Ant笔记
2010-10-26 19:57 1337Ant是一个在Java开发里面很传说的一个工具,以前一直听说, ... -
Propertiess资源文件的读取和简单的性能测试
2010-09-01 09:08 2461在编写代码时,常会考虑抽取一些可配置的参数到依赖文件中,其中比 ... -
Spring roo 乱入
2010-02-11 10:55 6156比较新的东西,其实可以 ... -
Junit随记
2010-01-13 18:29 1058顶级的开发人员素养 在idea中,可以方便的使用ctrl+sh ... -
spring 下的一些Utils
2010-01-11 19:07 249407年的文章,对Spring提供的工具类提供了介绍,可以安排时 ... -
Apache随记
2009-12-03 14:31 1272对于Apache的学习,可以参 ... -
ibatis杂集
2009-12-02 14:38 1879基础配置文件为SqlMapConfig.xml,其中和Spri ... -
freemarker常见语法大全
2009-11-30 18:59 3258格式比较乱一些,适合ctrl+f搜索关键字 FreeMark ... -
常用Spring Annotation
2009-09-21 14:38 1343一:@Autowired 最常见的注解,用于注入一个已经配 ... -
Regular Expression 正则表达式使用(多语言)
2009-09-11 17:29 1535下面为在Editplus中使用内置的正则表达式的帮助 Regu ... -
Resource Releases Resource 资源释放.
2009-07-07 21:34 1033原文地址:http://www.c2.com/ ... -
Name Static Methods For Static Import 合理命名静态导入方法
2009-07-05 21:26 1070原文地址:http://www.c2.com/cgi/wiki ... -
Bounded Wildcards Increase Applicability 使用界限通配符提供适用性
2009-07-04 21:57 1109原文地址:http://www.c2.com/cgi/wiki ... -
Annotations Over Naming Conventions 使用注解代替命名约定
2009-07-03 23:08 1492越看这些文章,感觉Effect java 第二版里面基本都有. ... -
Annotations Over Tag Interfaces 使用注解代替标志接口
2009-07-02 23:31 1364原文地址:http://www.c2.com/cgi/wiki ... -
Varargs Collection Factory Method 参数集合工厂方法
2009-07-01 22:17 654原文地址 http://www.c2.com/ ... -
GWT Developer's Guide随记
2009-06-23 17:45 3185比Getting Started介绍的更详细一下 HTML ... -
GWT Tutorials节选
2009-06-19 18:56 1978本文写的乱七八糟..只 ...
相关推荐
基于springboot教育资源共享平台源码数据库文档.zip
linux开发篇,配套视频:https://www.bilibili.com/list/474327672?sid=4493702&spm_id_from=333.999.0.0&desc=1
ReadEra 这个阅读应用能够打开下列任何格式的文档: EPUB, PDF, DOC, RTF, TXT, DJVU, FB2, MOBI, 和 CHM. 基本上来说,你可以用它阅读你的设备内存中的任何书籍或者文本文档。 这个应用与划分成章节的文档兼。,有一个书签功能,可以在你阅读的时候,自动保存你的进度。另外,它让你更改页面模式,从几种不同的主题中进行挑选(夜间,白天,棕黑色调,还有控制台)。
软件环境:KEIL4 硬件环境:STM32单片机+舵机 控制原理:通过控制输出信号的占空比调节舵机旋转的角度
基于springboot仓库管理系统源码数据库文档.zip
酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 酒店管理系统源码C++实现的毕业设计项目源码.zip,酒店管理系统源码C++实现的毕业设计项目源码.zip个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。酒店管理系统源码C++实现的毕业设计项目源码.zip,个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分98.5分。主要针对计算机相关专业的正在做毕
58商铺全新UI试客试用平台网站源码
springboot vue3前后端分离 基于SpringBoot+Vue的轻量级定时任务管理系统.zip
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
4D毫米波雷达点云数据处理方法研究.caj
S M 2 2 5 8 X T 量产工具供大家下载使用
基于springboot的文物管理系统源码数据库文档.zip
基于springboot的电影院售票管理系统源码数据库文档.zip
基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。
美容美发项目,使用django框架,前后端一体化项目
在线票务:2023年中国在线票务行业市场规模约为24.99亿元,挖掘市场蓝海新机遇 在数字浪潮的席卷下,传统的票务销售模式正经历着前所未有的变革。纸质门票逐渐淡出人们的视野,取而代之的是便捷、高效的数字和移动票务。这一转变不仅为消费者带来了前所未有的购票体验,更为在线票务平台开辟了广阔的发展空间和市场机遇。随着国民经济的持续增长和文体娱乐行业的蓬勃发展,中国在线票务行业正站在时代的风口浪尖,等待着每一位有志之士的加入。那么,这片蓝海市场究竟蕴藏着怎样的潜力?又该如何把握机遇,实现突破?让我们一同探索。 市场概况: 近年来,中国在线票务行业市场规模持续扩大,展现出强劲的增长势头。据QYResearch数据显示,2023年中国在线票务行业市场规模约为24.99亿元,尽管受到宏观经济的影响,市场规模增速放缓,但整体趋势依然向好。这一增长主要得益于国民人均收入的不断提高、电影及演出行业的快速发展以及政府政策的支持。例如,2023年财政部、国家电影局发布的《关于阶段性免征国家电影事业发展专项资金政策的公告》,为电影行业注入了强劲动力,进而推动了在线票务市场规模的扩大。 技术创新与趋势: 技术进步
基于SpringBoot的养老院管理系统源码数据库文档.zip
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
内容概要:本文档是一份详细的Go语言教程,从基础概念介绍到高级主题均有覆盖。主要内容包括Go语言的基础语法、数据类型、控制结构、函数、结构体、接口和并发编程等方面。通过具体示例介绍了如何使用Go语言进行开发。 适合人群:初学者和有一定经验的程序员都可以从这篇教程中受益,特别是那些想要快速掌握Go语言并应用于实际项目的开发者。 使用场景及目标:适用于初学者系统学习Go语言的基础知识和常用功能;也可以作为已有开发经验者的参考资料,帮助他们解决具体的编程问题,提高开发效率。 其他说明:本教程不仅包含了Go语言的基本知识点,还重点讲解了其独特的并发编程模型。读者在学习过程中应该注重理论与实践相结合,通过实际编写代码来加深理解和记忆。
基于springboot计算机基础网上考试系统源码数据库文档.zip