- 浏览: 1030791 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
繁星水:
Useful!!
Object-C之(Null)与(Bool) -
pacer123:
请问注解@ApiModelProperty 在哪个jar包下面 ...
Micro Service工具集之Swagger:可测试的样式化API文档 -
sucheng2016:
这东东真的好用么/
对象转换利器之Dozer -
zzq0324:
http://git.oschina.net/zzq0324/ ...
基于Spring-WS的Restful API的集成测试 -
lrz0534:
你好,我在maven上面下载了swagger-springmv ...
Micro Service工具集之Swagger:可测试的样式化API文档
接上篇,接下来练习通过AIO实现一个简单的TCP server。熟悉NIO的朋友应该都了解ServerSocket,在AIO中与之对应的就是AsynchronousServerSocketChannel,查看其API文档,介绍如下”An asynchronous channel for stream-oriented listening sockets. “,就是一个异步的数据流监听Socket。其主要函数有如下几个:
accept(): 接受一个连接,返回一个Future,可通过Future获取到Socket的状态,和数据。
accept(A attachment, CompletionHandler<AsynchronousSocketChannel,? super A> handler):接受连接,并为连接绑定一个CompletionHandler处理Socket连接
bind(SocketAddress local):把ServerSocket绑定到本地端口上,等待连接。
bind(SocketAddress local, int backlog):功能和上面一个方法一样,添加了backlog参数指定队列中挂起的连接的最大个数
open():开启一个异步Socket通道,
open(AsynchronousChannelGroup group):开启一个异步Socket通道,并把通道加入指定的组做资源管理
provider():返回这个Channel的创建者
setOption(SocketOption<T> name, T value):配置Socket参数的方法。
下面就是通过AsynchronousServerSocketChannel实现的一个简单的EchoServer,服务器会打印出收到的客户端输入,并把输入写回客户端。(注:代码只有在JDK1.7下才能编译通过)
运行时会打印出如下信息:
Listening on localhost:6025
Channel Provider : sun.nio.ch.BsdAsynchronousChannelProvider@625cb0bb
在客户端,可以通过telnet localhost 6025验证服务
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
输入 hello,回车,客户端会打印
hello
hello
Connection closed by foreign host.
服务器端会有打印
waiting....
Echo hello to sun.nio.ch.UnixAsynchronousSocketChannelImpl[connected local=/127.0.0.1:6025 remote=/127.0.0.1:54611]
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
你指的Callable线程是什么线程。好像没用过。不过我觉得nio提供的异步socket很好用。不用去写线程。而且现在我在写一个,在网页上与设备通信的项目。在web服务端有个socket服务器。设备是通过串口连接电脑的。通过socket服务器转发消息。而且页面发的消息,设备要及时响应,所有socket服务器不得不用同步的。
不是太了解你的需求,不过你可以看一下AsynchronousSocketChannel的用法,应该就是你想要的那种异步客户端的效果。
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
你指的Callable线程是什么线程。好像没用过。不过我觉得nio提供的异步socket很好用。不用去写线程。而且现在我在写一个,在网页上与设备通信的项目。在web服务端有个socket服务器。设备是通过串口连接电脑的。通过socket服务器转发消息。而且页面发的消息,设备要及时响应,所有socket服务器不得不用同步的。
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
accept(): 接受一个连接,返回一个Future,可通过Future获取到Socket的状态,和数据。
accept(A attachment, CompletionHandler<AsynchronousSocketChannel,? super A> handler):接受连接,并为连接绑定一个CompletionHandler处理Socket连接
bind(SocketAddress local):把ServerSocket绑定到本地端口上,等待连接。
bind(SocketAddress local, int backlog):功能和上面一个方法一样,添加了backlog参数指定队列中挂起的连接的最大个数
open():开启一个异步Socket通道,
open(AsynchronousChannelGroup group):开启一个异步Socket通道,并把通道加入指定的组做资源管理
provider():返回这个Channel的创建者
setOption(SocketOption<T> name, T value):配置Socket参数的方法。
下面就是通过AsynchronousServerSocketChannel实现的一个简单的EchoServer,服务器会打印出收到的客户端输入,并把输入写回客户端。(注:代码只有在JDK1.7下才能编译通过)
public class AIOEchoServer { private AsynchronousServerSocketChannel server; public static void main(String[] args) throws IOException { AIOEchoServer aioServer = new AIOEchoServer(); aioServer.init("localhost", 6025); } private void init(String host, int port) throws IOException { //ChannelGroup用来管理共享资源 AsynchronousChannelGroup group = AsynchronousChannelGroup.withCachedThreadPool(Executors.newCachedThreadPool(), 10); server = AsynchronousServerSocketChannel.open(group); //通过setOption配置Socket server.setOption(StandardSocketOptions.SO_REUSEADDR, true); server.setOption(StandardSocketOptions.SO_RCVBUF, 16 * 1024); //绑定到指定的主机,端口 server.bind(new InetSocketAddress(host, port)); System.out.println("Listening on " + host + ":" + port); //输出provider System.out.println("Channel Provider : " + server.provider()); //等待连接,并注册CompletionHandler处理内核完成后的操作。 server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() { final ByteBuffer buffer = ByteBuffer.allocate(1024); @Override public void completed(AsynchronousSocketChannel result, Object attachment) { System.out.println("waiting...."); buffer.clear(); try { //把socket中的数据读取到buffer中 result.read(buffer).get(); buffer.flip(); System.out.println("Echo " + new String(buffer.array()).trim() + " to " + result); //把收到的直接返回给客户端 result.write(buffer); buffer.flip(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { try { //关闭处理完的socket,并重新调用accept等待新的连接 result.close(); server.accept(null, this); } catch (IOException e) { e.printStackTrace(); } } } @Override public void failed(Throwable exc, Object attachment) { System.out.print("Server failed...." + exc.getCause()); } }); //因为AIO不会阻塞调用进程,因此必须在主进程阻塞,才能保持进程存活。 try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行时会打印出如下信息:
Listening on localhost:6025
Channel Provider : sun.nio.ch.BsdAsynchronousChannelProvider@625cb0bb
在客户端,可以通过telnet localhost 6025验证服务
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
输入 hello,回车,客户端会打印
hello
hello
Connection closed by foreign host.
服务器端会有打印
waiting....
Echo hello to sun.nio.ch.UnixAsynchronousSocketChannelImpl[connected local=/127.0.0.1:6025 remote=/127.0.0.1:54611]
评论
5 楼
samm
2013-11-30
server.accept(null, this);
这个相当不友好哇,completed()应该只是业务。
有没有直接server.accept之后wait的?然后有请求立马notify继续accept。
while(true){
server.accept(...);
}
public void completed(...){
// 仅仅业务操作。
}
这个相当不友好哇,completed()应该只是业务。
有没有直接server.accept之后wait的?然后有请求立马notify继续accept。
while(true){
server.accept(...);
}
public void completed(...){
// 仅仅业务操作。
}
4 楼
ningandjin
2013-04-03
lb_gongfu 写道
ningandjin 写道
lb_gongfu 写道
老兄,问你个问题。这样行吗,服务端使用阻塞的,而客户端使用异步的,这样可以通信吗?
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
你指的Callable线程是什么线程。好像没用过。不过我觉得nio提供的异步socket很好用。不用去写线程。而且现在我在写一个,在网页上与设备通信的项目。在web服务端有个socket服务器。设备是通过串口连接电脑的。通过socket服务器转发消息。而且页面发的消息,设备要及时响应,所有socket服务器不得不用同步的。
不是太了解你的需求,不过你可以看一下AsynchronousSocketChannel的用法,应该就是你想要的那种异步客户端的效果。
3 楼
lb_gongfu
2013-04-03
ningandjin 写道
lb_gongfu 写道
老兄,问你个问题。这样行吗,服务端使用阻塞的,而客户端使用异步的,这样可以通信吗?
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
你指的Callable线程是什么线程。好像没用过。不过我觉得nio提供的异步socket很好用。不用去写线程。而且现在我在写一个,在网页上与设备通信的项目。在web服务端有个socket服务器。设备是通过串口连接电脑的。通过socket服务器转发消息。而且页面发的消息,设备要及时响应,所有socket服务器不得不用同步的。
2 楼
ningandjin
2013-04-01
lb_gongfu 写道
老兄,问你个问题。这样行吗,服务端使用阻塞的,而客户端使用异步的,这样可以通信吗?
客户端异步,不是多线程就可以解决了吗?在主线程中使用Callable线程去调用服务器,检测到完成再从中把结果读取出来。
1 楼
lb_gongfu
2013-03-27
老兄,问你个问题。这样行吗,服务端使用阻塞的,而客户端使用异步的,这样可以通信吗?
发表评论
-
关于并发的思考
2015-02-08 22:33 4279并发数 并发数和2个因 ... -
使用Hystrix守护应用(3)
2015-01-02 22:04 12833监控HystrixCommand 除了隔离依赖服务的调用外,H ... -
使用Hystrix守护应用(2)
2014-12-30 14:35 16770接上篇(http://ningandjiao.iteye.co ... -
使用Hystrix守护应用(1)
2014-12-30 14:28 15205Hystrix(https://github.com/Netf ... -
Mac下同时安装多个版本的JDK
2014-04-14 21:42 33129JDK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下 ... -
性能测试工具之Gatling
2014-01-15 19:27 17230Gatling一直是久闻其名但 ... -
JavaMail测试工具之GreenMail
2014-01-08 19:13 7331不管现在各种Mock框架的运用有多广,我个人在写单元测试的时候 ... -
定制一个Gradle Plugin --- project-structure
2014-01-03 21:23 8422最近在项目中遇到一个 ... -
Restful Spring MVC应用的Request验证
2013-12-26 15:05 23310在开放平台的时候,尤其是坐Rest服务的时候,因为用户可以给你 ... -
Spring MVC中的异常处理
2013-12-25 13:13 24107在一个良好的Rest架构的应用中,所有的异常都应该有对应的Ht ... -
Spring 4.0升级小贴士
2013-12-22 19:40 11399随着Spring4.0的发布,很多同志估计都在考虑升级的事情了 ... -
Spring4.0给我们带来什么?
2013-12-22 17:13 44969JDK8 对JDK8的支持,这个目前来说还是探索性质,毕竟Ja ... -
RESTful API版本控制策略
2013-12-15 19:51 31619做RESTful开放平台,一方面其API变动越少, 对API调 ... -
对象转换利器之Dozer
2013-12-14 22:46 19801在Java的世界中,经常会 ... -
基于Spring-WS的Restful API的集成测试
2013-11-28 19:41 8937在很多Java企业级应用中,Spring占据了非常重要的位置, ... -
TDD Of Spring JMS
2013-11-25 19:53 1713不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有 ... -
Micro Service工具集之Swagger:可测试的样式化API文档
2013-09-28 19:55 44671在我之前的一篇博文中,介绍了Yammer开发团队贡献的开源微服 ... -
进击的Java开发
2013-07-14 20:48 5857今天在公司的邮件组中看到一组很有趣的讨论,这是我最喜欢目前公司 ... -
说说SpringBatch的领域概念
2013-06-21 20:32 3585谈到Spring Batch,会谈到 ... -
做项目时需要考虑的安全性问题
2013-04-16 20:20 4733在开发一个项目的时候,大家经常会忽略项目的安全性问题,有很多的 ...
相关推荐
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...
jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...
jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows...
jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-...
压缩包内容: Java SE Development Kit 8u301 (1)jdk-8u301-linux-aarch64.rpm (2)jdk-8u301-linux-aarch64.tar.gz (3)jdk-8u301-linux-arm32-vfp-hflt.tar.gz ...(7)jdk-8u301-linux-x64.tar.gz
jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_linux-x64_bin.tar.gz文件 jdk-11.0.19_...
jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586...
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
三个版本的java jdk分别是:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.exe
jdk-7u79-windows-i586.exe JDK7 稳定版 源官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
jdk1.7 64位 jdk-7u67-linux-x64.tar.gz、jdk1.7 64位 jdk-7u67-linux-x64.tar.gz、jdk1.7 64位 jdk-7u67-linux-x64.tar.gz、
jdk-7-windows-x32 32为 JDK 7
jdk-7u25-windows-x64& jdk-7u25-windows-i586.exe
jdk1.7 64位官方正式版 jdk-7u79-linux-x64.tar.gz
jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10...
开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...
jdk-7u67-linux-x64.tar包现在 linux jdk下载
jdk-7u25-windows-i586.zip
jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64...