JAVA基础知识之网络编程——-基于AIO的异步Socket通信

异步IO

下面摘子李刚的《疯狂JAVA讲义》

按照POSIX标准来划分IO,分为同步IO和异步IO。对于IO操作分为两步,1)程序发出IO请求。 2)完成实际的IO操作。

阻塞IO和非阻塞IO都是针对第一步来划分的,如果发出IO请求会阻塞线程,就是阻塞IO,否则就是非阻塞IO。

同步IO和非同步IO是针对第二步来说的,如果实际IO操作是由操作系统完成,再返回给程序,就是异步IO。

如果实际的IO需要程序本身去执行,会阻塞线程,就是同步IO。

 

JAVA7的NIO.2提供了异步的channel, 从而使网络Socket的异步通信成为可能。

使用异步IO通信只需要三步,

  1. 调用open静态方法创建AsynchronousServerSocketChannel
  2. 调用AsynchronousServerSocketChannel的bind方法监听指定IP和端口
  3. 调用AsynchronousServerSocketChannel的accept方法接受连接请求

下面是一个简单例子,

服务器端

 1 package aio;
 2 
 3 import java.io.IOException;
 4 import java.net.InetSocketAddress;
 5 import java.nio.ByteBuffer;
 6 import java.nio.channels.AsynchronousServerSocketChannel;
 7 import java.nio.channels.AsynchronousSocketChannel;
 8 import java.util.concurrent.ExecutionException;
 9 import java.util.concurrent.Future;
10 
11 public class Server {
12     private static final int PORT = 3002;
13     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
14         try {
15             AsynchronousServerSocketChannel serverChannel =  AsynchronousServerSocketChannel.open();
16             serverChannel.bind(new InetSocketAddress(PORT));
17             while (true) {
18                 Future<AsynchronousSocketChannel> future = serverChannel.accept();
19                 //获取连接成功之后的AsynchronousSocketChannel
20                 AsynchronousSocketChannel socketChannel = future.get();
21                 socketChannel.write(ByteBuffer.wrap("你好,这是AIO世界".getBytes("utf-8"))).get();
22             }
23         } catch(IOException e) {
24             e.printStackTrace();
25         }
26     }
27 }

客户端

 1 package aio;
 2 
 3 import java.io.IOException;
 4 import java.net.InetSocketAddress;
 5 import java.nio.ByteBuffer;
 6 import java.nio.channels.AsynchronousSocketChannel;
 7 import java.nio.charset.Charset;
 8 import java.util.concurrent.ExecutionException;
 9 
10 public class Client {
11     private static final int PORT = 3002;
12     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
13         ByteBuffer buff = ByteBuffer.allocate(1024);
14         Charset utf = Charset.forName("utf-8");
15         try {
16             AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
17             clientChannel.connect(new InetSocketAddress("127.0.0.1",PORT)).get();
18             buff.clear();
19             clientChannel.read(buff).get();
20             buff.flip();
21             String content = utf.decode(buff).toString();
22             System.out.println("服务器信息:"+content);
23         } catch (IOException ex) {
24             ex.printStackTrace();
25         }
26     }
27 }

执行结果,使用一个服务器端和两个客户端测试,

 

转载于:https://www.cnblogs.com/fysola/p/6087227.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

【数据库原理及应用】经典题库附答案(14章全)——第十二章:数据库技术新发展

【数据库原理及应用】经典题库附答案(14章全)——第一章:数据库基础知识 【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识 【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL 【数据库原理及应用】经典题库附答案(14章…

EditPlus 文件查找功能:在指定文件夹,用正则查寻包含指定内容的文件,指定文件类型,并排除特殊文件名文件

单击菜单栏上的【Search】&#xff08;查找&#xff09;&#xff0c;选择【Find in Files】&#xff08;在文件中查找&#xff09;命令&#xff1a; 查找项&#xff1a;正则查找video标签&#xff0c;src为不包含http的mp4 <video src"([^http].*\.mp4)" width&q…

【数据库原理及应用】经典题库附答案(14章全)——第十三章:面向对象程数据库系统

【数据库原理及应用】经典题库附答案(14章全)——第一章:数据库基础知识 【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识 【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL 【数据库原理及应用】经典题库附答案(14章…

NOIP2016普及组第三题——海港

题目描述 小K是一个海港的海关工作人员&#xff0c;每天都有许多船只到达海港&#xff0c;船上通常有很多来自不同国家的乘客。 小K对这些到达海港的船只非常感兴趣&#xff0c;他按照时间记录下了到达海港的每一艘船只情况&#xff1b;对于第i艘到达的船&#xff0c;他记录了这…

7z-linux下解决中文名乱码的终极办法

为什么80%的码农都做不了架构师&#xff1f;>>> linux上安装7z主要是为了解决中文文件名乱码的问题&#xff0c;压缩率还是其次原因 具体安装看参考网址&#xff0c;建议用源码方式安装 官网下载地址&#xff1a;http://www.7-zip.org/download.html 源文件项目地址…

C# .Net 视频下载功能(本机文件)及转发下载功能(Http远程文件)

/*服务器本机文件下载*/ Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType "application/octet-stream"; Response.ContentEncoding …

工具箱之 IKVM.NET 项目新进展

在各种群里经常讨论的一个事情是.NET 如何调用 Java 的实现&#xff0c;最常见的场景之一就是在加解密方面Java提供的密钥&#xff0c;C#无法解密&#xff0c; C#中byte范围是[0,255]&#xff0c;而Java中的byte范围是[-128,127]&#xff0c;由于密码生成器是java所独有的&…

【数据库原理及应用】经典题库附答案(14章全)——第十四章:分布式数据库系统

【数据库原理及应用】经典题库附答案(14章全)——第一章:数据库基础知识 【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识 【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL 【数据库原理及应用】经典题库附答案(14章…

一天一种设计模式之六-----工厂方法模式

2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式。工厂方法模式定义&#xff1a;定义一个用于创建对象的借口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到了他的子类。一般工厂类会有一个工厂的接…

[转]IPython介绍

1. IPython介绍 ipython是一个python的交互式shell&#xff0c;比默认的python shell好用得多&#xff0c;支持变量自动补全&#xff0c;自动缩进&#xff0c;支持bash shell命令&#xff0c;内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python…

.NET MAUI in Mac

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;4分钟&#xff09;概要本篇文章主要分享MAUI在m1芯片的设备上运行和支持情况&#xff0c;将我们写好的MAUI程序编译为支持mac平台的版本。在m1芯片刚刚出来的时候有很多开发工具和应用程序对m1芯片的支持不是很友好&a…

30分钟时长千行代码《C#程序设计基础》经典程序,C#菜鸟开发必备!

作者:刘一哥GIS(CSDN博客专家) 博客地址:https://geostorm.blog.csdn.net/ 刘一哥,多年研究地图学、地理信息系统、遥感、摄影测量和GPS等应用,精通ArcGIS、MapGIS、ENVI、Erdas、CASS、Pix4d、CC、PhotoScan、Inpho、EPS、Globalmapper等专业软件的应用,精通多门编程语…

前端开发中的SEO

前端开发中的SEO 什么是SEO SEO由英文Search Engine Optimization缩写而来&#xff0c;中文意译为“搜索引擎优化”。SEO是指从自然搜索结果获得网站流量的技术和过程&#xff0c;是在了解搜索引擎自然排名机制的基础上&#xff0c;对网站进行内部及外部的调整优化&#xff0c;…

grep命令

请见附件&#xff1b;转载于:https://blog.51cto.com/11203760/1750457

windows 常用系统变量

常用&#xff1a; %USERPROFILE% C:\Users\用户名 %SystemRoot% C:\WINDOWS %SystemDrive% C: %APPDATA% C:\Users\用户名\AppData\Roaming %LOCALAPPDATA% C:\Users\用户名\AppData\Local %windir% C:\WINDOWS %Path% C:\Windows\system32;C:\Wi…

C# 自定义并动态切换光标

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;唐宋元明清的博客原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/14873136.html系统有很多光标类型 &#xff1a;Cursors 类 (System.Windows.Input) | Microsoft Docs[1]本章介绍如…

HTML基础加强

1. 什么是浏览器&#xff1a;解释和执行HTML源码的工具。 2. 什么是静态页面&#xff0c;什么样的页面是动态页面&#xff1f; 静态页面&#xff1a;htm&#xff0c;html&#xff08;直接读取&#xff09; 动态网页&#xff1a;asp&#xff0c;aspx&#xff0c;jsp&#xff0c;…

视频播放器for android

写在前面 好久没有写博客了, 中间忙了一堆杂七杂八的事情...工作, 情感, 未来, 人生... 下面是正文 一直要写一个视频播放器, 好练练手. 这个app, 从年前写到现在, 终于算弄出了样子, 0.0版本. (不得不说, googleVPN值得拥有, android developer网站, android sdk samples, sta…

我要偷偷学习C#,然后学习GIS二次开发之试题汇总(附答案)

一、单项选择题(每小题2分,共20分) 在类作用域中能够通过直接使用该类的( )成员名进行访问。 A. 私有 B. 公用 C. 保护 D. 任何 答案:D 小数类型(decimal)和浮点类型都可以表示小数,正确说法:( ) A. 两者没有任何区别 B. 小数类型比浮点类型取值范围大 C.小数类型比浮…