- 浏览: 1036641 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
繁星水:
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 4340并发数 并发数和2个因 ... -
使用Hystrix守护应用(3)
2015-01-02 22:04 12876监控HystrixCommand 除了隔离依赖服务的调用外,H ... -
使用Hystrix守护应用(2)
2014-12-30 14:35 16817接上篇(http://ningandjiao.iteye.co ... -
使用Hystrix守护应用(1)
2014-12-30 14:28 15285Hystrix(https://github.com/Netf ... -
Mac下同时安装多个版本的JDK
2014-04-14 21:42 33241JDK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下 ... -
性能测试工具之Gatling
2014-01-15 19:27 17299Gatling一直是久闻其名但 ... -
JavaMail测试工具之GreenMail
2014-01-08 19:13 7369不管现在各种Mock框架的运用有多广,我个人在写单元测试的时候 ... -
定制一个Gradle Plugin --- project-structure
2014-01-03 21:23 8496最近在项目中遇到一个 ... -
Restful Spring MVC应用的Request验证
2013-12-26 15:05 23369在开放平台的时候,尤其是坐Rest服务的时候,因为用户可以给你 ... -
Spring MVC中的异常处理
2013-12-25 13:13 24167在一个良好的Rest架构的应用中,所有的异常都应该有对应的Ht ... -
Spring 4.0升级小贴士
2013-12-22 19:40 11441随着Spring4.0的发布,很多同志估计都在考虑升级的事情了 ... -
Spring4.0给我们带来什么?
2013-12-22 17:13 45033JDK8 对JDK8的支持,这个目前来说还是探索性质,毕竟Ja ... -
RESTful API版本控制策略
2013-12-15 19:51 31741做RESTful开放平台,一方面其API变动越少, 对API调 ... -
对象转换利器之Dozer
2013-12-14 22:46 19880在Java的世界中,经常会 ... -
基于Spring-WS的Restful API的集成测试
2013-11-28 19:41 9070在很多Java企业级应用中,Spring占据了非常重要的位置, ... -
TDD Of Spring JMS
2013-11-25 19:53 1760不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有 ... -
Micro Service工具集之Swagger:可测试的样式化API文档
2013-09-28 19:55 44742在我之前的一篇博文中,介绍了Yammer开发团队贡献的开源微服 ... -
进击的Java开发
2013-07-14 20:48 5913今天在公司的邮件组中看到一组很有趣的讨论,这是我最喜欢目前公司 ... -
说说SpringBatch的领域概念
2013-06-21 20:32 3626谈到Spring Batch,会谈到 ... -
做项目时需要考虑的安全性问题
2013-04-16 20:20 4787在开发一个项目的时候,大家经常会忽略项目的安全性问题,有很多的 ...
相关推荐
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-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...
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-...
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_...
压缩包内容: 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
3. **运行安装脚本**:执行解压后的二进制文件以开始安装过程,`./jdk-6u45-linux-x64.bin`。 4. **配置环境变量**:安装完成后,你需要将JDK的路径添加到系统的PATH环境变量中。这通常通过修改`~/.bashrc`或`~/....
标题“jdk-7u51-windows-x64.zip”指的是Java Development Kit (JDK) 的一个特定版本,针对Windows x64操作系统的安装包。这个版本是7u51,代表JDK 7 Update 51。JDK是Java编程语言的核心组件,包含了开发和运行Java...
在这个场景中,我们关注的是`jdk-7u67-linux-x64.tar`文件,这是一款适用于64位Linux操作系统的JDK 7更新67版本的归档文件。 1. **JDK版本**: `7u67`指的是JDK 7的第67个更新。Java通常发布主要版本(如JDK 8、JDK ...
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...
jdk-7u79-windows-i586.exe JDK7 稳定版 源官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
本主题涉及两个特定于Linux平台的JDK版本:jdk-8u171-linux-x64.rpm和jdk-8u171-linux-x64.tar.gz。这两个文件分别对应于两种不同的安装方式,适应于不同类型的Linux系统需求。 首先,`jdk-8u171-linux-x64.rpm`是...
标题“jdk-7u25-windows-i586.exe”指的是Java Development Kit(JDK)的7u25版本的32位Windows安装程序。这个文件是Oracle公司为Windows操作系统提供的一个可执行文件,用于在计算机上安装Java开发环境。JDK是Java...
jdk-7u51-windows-x64 JDK 64位,适用于WIN 64位系统JDK,全名是Java SE Development Kit,Java的研发环境,使用最广泛的Java SDK,JDK是研发与编译JAVA程序,必不可少的环境,64位的JDK解压出来就是jdk-7u51-...
官方下载链接:https://download.oracle.com/otn/java/jdk/8u251-b08/3d5a2bb8f8d4428bbe94aed7ec7ae784/jdk-8u251-windows-x64.exe 觉得慢的话可以用txt里百度网盘下载,附件为网盘地址和提取码 jdk8 jdk-8u251-...
描述 "JDK java jar 包最新 下载解压即可 jdk-8u261-linux-x64.tarjdk-8u261-linux-x64.tarjdk-8u261-linux-x64.tar" 表明这是Java开发工具包的一个更新版本,特别是JDK 8 Update 261(8u261),并且提供的是一个可...
jdk-7u67-windows-x64.exe 资源:http://download.csdn.net/user/ajlgl/uploads 百度云:https://pan.baidu.com/s/1dESLQY9
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...