Java三种IO模型,一次搞懂!|焦点要闻
Java BIO相关的实现都位于java.io包下,其通信原理是客户端、服务端之间通过Socket套接字建立管道连接,然后从管道中获取对应的输入/输出流,最后利用输入/输出流对象实现发送/接收信息。
大家好,我是老三,上一节我们讨论了Linux的五种IO模型,接下来,我们从Java语言层面,来看看对IO的实现。
在Java中,一共有三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO)。
(资料图片)
Linux五种IO模型和Java三种IO模型
Java BIO
Java BIO就是Java的传统IO模型,对应了操作系统IO模型里的阻塞IO。
Java BIO相关的实现都位于java.io包下,其通信原理是客户端、服务端之间通过Socket套接字建立管道连接,然后从管道中获取对应的输入/输出流,最后利用输入/输出流对象实现发送/接收信息。
我们来看个Demo:
BioServer:/** * @Author 三分恶 * @Date 2023/4/30 * @Description BIO服务端 */public class BioServer { public static void main(String[] args) throws IOException { //定义一个ServerSocket服务端对象,并为其绑定端口号 ServerSocket server = new ServerSocket(8888); System.out.println("===========BIO服务端启动================"); //对BIO来讲,每个Socket都需要一个Thread while (true) { //监听客户端Socket连接 Socket socket = server.accept(); new BioServerThread(socket).start(); } } /** * BIO Server线程 */ static class BioServerThread extends Thread{ //socket连接 private Socket socket; public BioServerThread(Socket socket){ this.socket=socket; } @Override public void run() { try { //从socket中获取输入流 InputStream inputStream=socket.getInputStream(); //转换为 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); String msg; //从Buffer中读取信息,如果读取到信息则输出 while((msg=bufferedReader.readLine())!=null){ System.out.println("收到客户端消息:"+msg); } //从socket中获取输出流 OutputStream outputStream=socket.getOutputStream(); PrintStream printStream=new PrintStream(outputStream); //通过输出流对象向客户端传递信息 printStream.println("你好,吊毛!"); //清空输出流 printStream.flush(); //关闭socket socket.shutdownOutput(); } catch (IOException e) { e.printStackTrace(); } } }}
BioClient/** * @Author 三分恶 * @Date 2023/4/30 * @Description BIO客户端 */public class BioClient { public static void main(String[] args) throws IOException { List names= Arrays.asList("帅哥","靓仔","坤坤"); //通过循环创建多个多个client for (String name:names){ //创建socket并根据IP地址与端口连接服务端 Socket socket=new Socket("127.0.0.1",8888); System.out.println("===========BIO客户端启动================"); //从socket中获取字节输出流 OutputStream outputStream=socket.getOutputStream(); //通过输出流向服务端传递信息 String hello="你好,"+name+"!"; outputStream.write(hello.getBytes()); //清空流,关闭socket输出 outputStream.flush(); socket.shutdownOutput(); //从socket中获取字节输入流 InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); //读取服务端消息 String msg; while((msg=bufferedReader.readLine())!=null){ System.out.println("收到服务端消息:"+msg); } inputStream.close(); outputStream.close(); socket.close(); } }}
先启动BioServer,再启动BioClient,运行结果===========BIO服务端启动================收到客户端消息:你好,帅哥!收到客户端消息:你好,靓仔!收到客户端消息:你好,坤坤!
===========BIO客户端启动================收到服务端消息:你好,吊毛!===========BIO客户端启动================收到服务端消息:你好,吊毛!===========BIO客户端启动================收到服务端消息:你好,吊毛!
在上述Java-BIO的通信过程中,如果客户端一直没有发送消息过来,服务端则会一直等待下去,从而服务端陷入阻塞状态。同理,由于客户端也一直在等待服务端的消息,如果服务端一直未响应消息回来,客户端也会陷入阻塞状态。
在BioServer定义了一个类BioServerThread,继承了Thread类,run方法里主要是通过socket和流来读取客户端的消息,以及发送消息给客户端,每处理一个客户端的Socket连接,就得新建一个线程。
同时,IO读写操作也是阻塞的,如果客户端一直没有发送消息过来,线程就会进入阻塞状态,一直等待下去。
在BioClient里,循环创建Socket,向服务端收发消息,客户端的读写也是阻塞的。
在这个Demo里就体现了BIO的两个特点:
一个客户端连接对应一个处理线程读写操作都是阻塞的Java BIO
毫无疑问,不管是创建太多线程,还是阻塞读写,都会浪费服务器的资源。
Java NIO
那么我们就进入Java的下一种IO模型——Java NIO,它对应操作系统IO模型中的多路复用IO,底层采用了epoll实现。
Java-NIO则是JDK1.4中新引入的API,它在BIO功能的基础上实现了非阻塞式的特性,其所有实现都位于java.nio包下。NIO是一种基于通道、面向缓冲区的IO操作,相较BIO而言,它能够更为高效的对数据进行读写操作,同时与原先的BIO使用方式也大有不同。
我们还是先来看个Demo:
NioServer/** * @Author 三分恶 * @Date 2023/4/30 * @Description NIO服务端 */public class NioServer { public static void main(String[] args) throws IOException { //创建一个选择器selector Selector selector= Selector.open(); //创建serverSocketChannel ServerSocketChannel serverSocketChannel=ServerSocketChannel.open(); //绑定端口 serverSocketChannel.socket().bind(new InetSocketAddress(8888)); //必须得设置成非阻塞模式 serverSocketChannel.configureBlocking(false); //将channel注册到selector并设置监听事件为ACCEPT serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println("===========NIO服务端启动============"); while(true){ //超时等待 if(selector.select(1000)==0){ System.out.println("===========NIO服务端超时等待============"); continue; } // 有客户端请求被轮询监听到,获取返回的SelectionKey集合 Iterator iterator=selector.selectedKeys().iterator(); //迭代器遍历SelectionKey集合 while (iterator.hasNext()){ SelectionKey key=iterator.next(); // 判断是否为ACCEPT事件 if (key.isAcceptable()){ // 处理接收请求事件 SocketChannel socketChannel=((ServerSocketChannel) key.channel()).accept(); //非阻塞模式 socketChannel.configureBlocking(false); // 注册到Selector并设置监听事件为READ socketChannel.register(selector,SelectionKey.OP_READ, ByteBuffer.allocate(1024)); System.out.println("成功连接客户端"); } //判断是否为READ事件 if (key.isReadable()){ SocketChannel socketChannel = (SocketChannel) key.channel(); try { // 获取以前设置的附件对象,如果没有则新建一个 ByteBuffer buffer = (ByteBuffer) key.attachment(); if (buffer == null) { buffer = ByteBuffer.allocate(1024); key.attach(buffer); } // 清空缓冲区 buffer.clear(); // 将通道中的数据读到缓冲区 int len = socketChannel.read(buffer); if (len > 0) { buffer.flip(); String message = new String(buffer.array(), 0, len); System.out.println("收到客户端消息:" + message); } else if (len < 0) { // 接收到-1,表示连接已关闭 key.cancel(); socketChannel.close(); continue; } // 注册写事件,下次向客户端发送消息 socketChannel.register(selector, SelectionKey.OP_WRITE, buffer); } catch (IOException e) { // 取消SelectionKey并关闭对应的SocketChannel key.cancel(); socketChannel.close(); } } //判断是否为WRITE事件 if (key.isWritable()){ SocketChannel socketChannel = (SocketChannel) key.channel(); //获取buffer ByteBuffer buffer = (ByteBuffer) key.attachment(); String hello = "你好,坤坤!"; //清空buffer buffer.clear(); //buffer中写入消息 buffer.put(hello.getBytes()); buffer.flip(); //向channel中写入消息 socketChannel.write(buffer); buffer.clear(); System.out.println("向客户端发送消息:" + hello); // 设置下次读写操作,向 Selector 进行注册 socketChannel.register(selector, SelectionKey.OP_READ, buffer); } // 移除本次处理的SelectionKey,防止重复处理 iterator.remove(); } } }}
NioClientpublic class NioClient { public static void main(String[] args) throws IOException { // 创建SocketChannel并指定ip地址和端口号 SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8888)); System.out.println("==============NIO客户端启动================"); // 非阻塞模式 socketChannel.configureBlocking(false); String hello="你好,靓仔!"; ByteBuffer buffer = ByteBuffer.wrap(hello.getBytes()); // 向通道中写入数据 socketChannel.write(buffer); System.out.println("发送消息:" + hello); buffer.clear(); // 将channel注册到Selector并监听READ事件 socketChannel.register(Selector.open(), SelectionKey.OP_READ, buffer); while (true) { // 读取服务端数据 if (socketChannel.read(buffer) > 0) { buffer.flip(); String msg = new String(buffer.array(), 0, buffer.limit()); System.out.println("收到服务端消息:" + msg); break; } } // 关闭输入流 socketChannel.shutdownInput(); // 关闭SocketChannel连接 socketChannel.close(); }}
先运行NioServer,再运行NioClient,运行结果:===========NIO服务端启动=======================NIO服务端超时等待=======================NIO服务端超时等待============成功连接客户端收到客户端消息:你好,靓仔!向客户端发送消息:你好,坤坤!
==============NIO客户端启动================发送消息:你好,靓仔!收到服务端消息:你好,坤坤!
我们在这个案例里实现了一个比较简单的Java NIO 客户端服务端通信,里面有两个小的点需要注意,注册到选择器上的通道都必须要为非阻塞模型,同时通过缓冲区传输数据时,必须要调用flip()方法切换为读取模式。
代码流程示意图
Java-NIO中有三个核心概念:**Buffer(缓冲区)、Channel(通道)、Selector(选择器)**。
Java NIO
每个客户端连连接本质上对应着一个Channel通道,每个通道都有自己的Buffer缓冲区来进行读写,这些Channel被Selector选择器管理调度Selector负责轮询所有已注册的Channel,监听到有事件发生,才提交给服务端线程处理,服务端线程不需要做任何阻塞等待,直接在Buffer里处理Channel事件的数据即可,处理完马上结束,或返回线程池供其他客户端事件继续使用。通过Selector,服务端的一个Thread就可以处理多个客户端的请求Buffer(缓冲区)就是饭店用来存放食材的储藏室,当服务员点餐时,需要从储藏室中取出食材进行制作。Channel(通道)是用于传输数据的车道,就像饭店里的上菜窗口,可以快速把点好的菜品送到客人的桌上。Selector(选择器)就是大堂经理,负责协调服务员、厨师和客人的配合和沟通,以保证整个就餐过程的效率和顺畅。Java AIO
Java-AIO也被成为NIO2,它是在NIO的基础上,引入了新的异步通道的概念,并提供了异步文件通道和异步套接字的实现。
异步通道的实现体系
它们的主要区别就在于这个异步通道,见名知意:使用异步通道去进行IO操作时,所有操作都为异步非阻塞的,当调用read()/write()/accept()/connect()方法时,本质上都会交由操作系统去完成,比如要接收一个客户端的数据时,操作系统会先将通道中可读的数据先传入read()回调方法指定的缓冲区中,然后再主动通知Java程序去处理。
我们还是先来看个Demo:
AioServer/** * @Author 三分恶 * @Date 2023/5/1 * @Description AIO服务端 */public class AioServer { public static void main(String[] args) throws Exception { // 创建异步通道组,处理IO事件 AsynchronousChannelGroup group = AsynchronousChannelGroup.withFixedThreadPool(10, Executors.defaultThreadFactory()); //创建异步服务器Socket通道,并绑定端口 AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(group).bind(new InetSocketAddress(8888)); System.out.println("=============AIO服务端启动========="); // 异步等待接收客户端连接 server.accept(null, new CompletionHandler() { // 创建ByteBuffer final ByteBuffer buffer = ByteBuffer.allocate(1024); @Override public void completed(AsynchronousSocketChannel channel, Object attachment) { System.out.println("客户端连接成功"); try { buffer.clear(); // 异步读取客户端发送的消息 channel.read(buffer, null, new CompletionHandler() { @Override public void completed(Integer len, Object attachment) { buffer.flip(); String message = new String(buffer.array(), 0, len); System.out.println("收到客户端消息:" + message); // 异步发送消息给客户端 channel.write(ByteBuffer.wrap(("你好,阿坤!").getBytes()), null, new CompletionHandler() { @Override public void completed(Integer result, Object attachment) { // 关闭输出流 try { channel.shutdownOutput(); } catch (IOException e) { e.printStackTrace(); } } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); try { channel.close(); } catch (IOException e) { e.printStackTrace(); } } }); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); try { channel.close(); } catch (IOException e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } // 继续异步等待接收客户端连接 server.accept(null, this); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); // 继续异步等待接收客户端连接 server.accept(null, this); } }); // 等待所有连接都处理完毕 group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); }}
AioClient/** * @Author 三分恶 * @Date 2023/5/1 * @Description AIO客户端 */public class AioClient { public static void main(String[] args) throws Exception { // 创建异步Socket通道 AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); // 异步连接服务器 client.connect(new InetSocketAddress("127.0.0.1", 8888), null, new CompletionHandler() { // 创建ByteBuffer final ByteBuffer buffer = ByteBuffer.wrap(("你好,靓仔!").getBytes()); @Override public void completed(Void result, Object attachment) { // 异步发送消息给服务器 client.write(buffer, null, new CompletionHandler() { // 创建ByteBuffer final ByteBuffer readBuffer = ByteBuffer.allocate(1024); @Override public void completed(Integer result, Object attachment) { readBuffer.clear(); // 异步读取服务器发送的消息 client.read(readBuffer, null, new CompletionHandler() { @Override public void completed(Integer result, Object attachment) { readBuffer.flip(); String msg = new String(readBuffer.array(), 0, result); System.out.println("收到服务端消息:" + msg); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); try { client.close(); } catch (IOException e) { e.printStackTrace(); } } }); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); try { client.close(); } catch (IOException e) { e.printStackTrace(); } } }); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace(); try { client.close(); } catch (IOException e) { e.printStackTrace(); } } }); // 等待连接处理完毕 Thread.sleep(1000); // 关闭输入流和Socket通道 client.shutdownInput(); client.close(); }}
看下运行结果=============AIO服务端启动=========客户端连接成功收到客户端消息:你好,靓仔!
收到服务端消息:你好,阿坤!
可以看到,所有的操作都是异步进行,通过completed接收异步回调,通过failed接收错误回调。
而且我们发现,相较于之前的NIO而言,AIO其中少了Selector选择器这个核心组件,选择器在NIO中充当了协调者的角色。
但在Java-AIO中,类似的角色直接由操作系统担当,而且不是采用轮询的方式监听IO事件,而是采用一种类似于“订阅-通知”的模式。
Java AIO简图
在AIO中,所有创建的通道都会直接在OS上注册监听,当出现IO请求时,会先由操作系统接收、准备、拷贝好数据,然后再通知监听对应通道的程序处理数据。
Java-AIO这种异步非阻塞式IO也是由操作系统进行支持的,在Windows系统中提供了一种异步IO技术:IOCP(I/O Completion Port,所以Windows下的Java-AIO则是依赖于这种机制实现。不过在Linux系统中由于没有这种异步IO技术,所以Java-AIO在Linux环境中使用的还是epoll这种多路复用技术进行模拟实现的。
因为Linux的异步IO技术实际上不太成熟,所以Java-AIO的实际应用并不是太多,比如大名鼎鼎的网络通信框架Netty就没有采用Java-AIO,而是使用Java-NIO,在代码层面,自行实现异步。
小结
那么这期我们就快速过了一下Java的三种IO机制,它们的特点,我们直接看下图:
Java三种IO模型
我们也发现,虽然Java-NIO、Java-AIO,在性能上比Java-BIO要强很多,但是可以看到,写法上一个比一个难搞,不过好在基本也没人直接用Java-NIO、Java-AIO,如果要进行网络通信,一般都会采用Netty,它对原生的Java-NIO进行了封装优化,接下来,我们会继续走近Netty,敬请期待。
参考:
[1].《Netty权威指南》
[2].https://juejin.cn/post/7130952602350534693#heading-14
[3].https://www.jianshu.com/p/670033e5b916
标签:
推荐文章
- Java三种IO模型,一次搞懂!|焦点要闻
- 成都小孩入托入学前需要完成哪些疫苗的接种?
- 斗鱼回应监管进驻:将进一步优化内容审核机制
- 德马科技(688360)5月9日主力资金净卖出102.13万元
- 【快播报】路孚特:今年夏天欧洲电价涨跌不定 电力需求不太可能恢复至去年同期水平
- 女子花50多万购买奔驰,才开5个月轮毂开裂,4S店对维修单不认可
- 今年春耕期间化肥市场总体平稳-全球看点
- 护手钩什么时候有的(护手钩)-环球微动态
- 2023版30克熊猫银币现在市场价是多少(2023年05月09日)-天天速讯
- 京剧中经常发出洪亮粗犷叫声的是哪个行当|环球热讯
- 视焦点讯!源自东野圭吾成名小说 舞台剧《放学后》视觉化呈现悬疑推理
- 环球观点:童女迎新郎简谱(童女)
- 环保理念怎么写_环保的理念是什么
- 美媒:因暴力犯罪激增 女性成为美国增长最快枪支拥有群体
- 心里的声音百度云网盘13(心里的声音百度云)|世界时快讯
- 技改扩能,福海创“大动作”不断 天天报资讯
- 全球观焦点:甘肃临夏官方“亮”考古厚实家底 “六问”邀专家学者探究
- 全球微速讯:教育数字化转型,宝山“智慧同侪课堂”实现技术与教学深度融合
- 出行信息早知道!河北最新天气预报、限行提示、高速路况请查收→
- 热点评!三场专题研讨会助力戏曲艺术传承发展:聆听古老戏曲艺术时代新韵 让“北方戏窝子”展新颜
- 贵航股份:5月8日融资买入738.55万元,融资融券余额3.94亿元
- 全球球精选!矶竿什么牌子好知乎_矶竿什么牌子好
- 纳米技术有哪些神奇的功能_纳米技术有哪些_世界简讯
- 每日消息!甘州区北街街道流泉社区开展“三减三健”健康知识讲座
- 暖心!普惠走访收获亲情|每日热议
- 王君正跳槽华夏基金,两老牌10倍基迎来新“接棒人”
- vsdx文件能用word打开吗(vsdx文件用什么软件打开)
- 乡村绿洲副总经理董华祥辞职2022年公司净利141.65万-今日报
- vivox9plus参数配置介绍-vivox9plus参数配置 世界聚看点
- 环球滚动:重庆将推进8.3万户棚户区“焕新”|重钢崖线山城步道二期建成投用
- 融资丨「泰楚生物」完成A轮融资,IDG资本领投-全球信息
- 牡丹江贴吧最新消息_牡丹江贴吧
- 环球观天下!陇西县热电联产(背压式)供热、供汽建设(配套管网)工程材料采购(第二包)中标候选人公示
- 南京周生生黄金价格多少钱一克(2023年5月8日)_世界实时
- 环球看热讯:2023五险一金缴纳比例是多少 要求如下
- 数字政通涨20.00%
- 怎样鼓励初中孩子认真学 如何鼓励初中生-全球快资讯
- 梁思成简介梁思成父亲(梁思成简介)
- 每日看点!阳山水蜜桃是哪个省的城市
- 重返未来1999星锑获取方法一览 重返未来1999星锑怎么获得 全球关注
- 中国驻塞尔维亚大使:24年前那个夜晚的每一幕都难以忘怀
- 全新别克君越将于5月15日正式上市,外观内饰大变样
- 国务院联防联控机制将举行新闻发布会 天天观点
- 100kw380v用多大电缆和开关(100kw380v用多大电缆3+2) 世界热讯
- 世界速读:工商银行喜结良缘金条20克价格今天多少一克(2023年05月08日)
- 世界视讯!《浪姐4》品如艾莉争艳!张嘉倪吴倩有死了老公的美
- 株洲出台楼市利好新政!-环球视讯
- 美财长警告债务僵局或引发美国宪政危机:政府信用也将扫地 世界新动态
- 每日简讯:“全国都在咽喉炎”,到底是怎么回事?教你六招缓解嗓子疼
- 最新:碧云天黄叶地北雁南飞语出于哪里_碧云天 黄叶地 北雁南飞语出
- 第三届晓剑海南青年文学奖揭晓-全球热讯
- 10万亩野生杜鹃进入盛花期 浏阳大围山赏杜鹃正当时 天天最新
- 叙利亚重返阿盟
- 热点评!高手在民间!艺术“青年”痴迷根雕三十载
X 关闭
最新资讯
- 2022西安哪有摘樱桃的地方摘樱桃的地方在哪里
- 武汉横渡长江博物馆_关于武汉横渡长江博物馆简述 资讯推荐
- 天津机场坐机场大巴到天津站要多少时间能到_天津机场坐机场大巴到天津站要多少时间
- 塞中两国人士凭吊在中国驻南联盟使馆被炸事件中牺牲的烈士
- 我16g的内存设置多少的虚拟内存好_我16G的内存设置多少的虚拟内存好_今日快看
- 芝士可以自己在家做吗
- 天舟六号携带水果重量约是天舟五号两倍|焦点资讯
- 美国联邦通信委员会批准SpaceX部署7500颗第二代“星链”卫星
- 全球球精选!高跟鞋迅雷下载下载_高跟鞋迅雷下载
- 小学毕业留言100字_小学毕业留言 全球热议
- 广汽集团4月销量达17.7万辆,同比增长42.57%
- 环球焦点!Failed to connect to zw.gozuowen.com port 80: Timed out
- 湖人30分大胜勇士!1人回暖1人成奇兵,最可怕的是全力詹还没出现 每日关注
- 全球观热点:大脚魔兽世界盒子在哪_大脚魔兽世界盒子
- 外观定了?iPhone 15 Pro Max机模上手:1.57mm超窄边框、Type-C接口
- 火影忍者:不依靠血脉,也能闯出一片天地的5位忍者_环球快资讯
- 每日焦点!首批三星A-Die记忆体晶片出货带来更低成本的DDR4记忆体
- 岚皋县民主镇柳林村扶贫互助资金协会
- 今日热讯:666.2万千瓦!海南电网统调负荷创新高
- 世界今日报丨在校生_在校生是什么意思
- 世界今头条!加快推动“三高四新”美好蓝图 在株洲变成现实
- 俄一政党主席因汽车爆炸受伤 俄方称嫌疑人受乌克兰指使-世界微资讯
- 焦点快看:多地迎最强降雨 应对如何以早制早?来听专家分析
- 巴菲特:现金不是垃圾_环球速看料
- 欧丁玉的老婆像陈慧娴_欧丁玉
- 珠海艺术学院_珠海艺术学院
- 遇见你,真好;爱上你,真幸福
- 快看:信奉的反义词是什么 标准答案 信奉的反义词
- “财富管理博览2023”在港举行 聚焦亚洲经济新秩序 全球最新
- 绿树阴浓夏日长 小站稻开始插秧
- 深圳廉租房网址_深圳市廉租房申请官网|每日视点
- 环球微头条丨【三面财经·在场】江西丰城一河堤溃口30余米 当地正在紧急救援
- 天天速看:周琦短训营采访:寻找对抗+适应新帅理念 世界杯目标直通奥运会
- 环球动态:Mysteel日报:全国中厚板价格涨跌互现 预计下周窄幅震荡运行
- 祁连山国家公园雪豹卫星跟踪项目取得成功
- 杨村糕干好吃吗(杨村糕干)_世界简讯
- 北京冬奥组委公布财务收支报告:结余3.5亿元人民币
- 兔宝宝:4月28日接受机构调研,广发证券、西部证券等多家机构参与 今日视点
- 电灯的最初发明者是谁-今亮点
- 派出所回应杭州高空扔狗事件:正在处理
- UFO接走了洋人街的皇帝
- 意甲争四进入白热化,34轮的结果是决定性的,本轮...
- 【环球新要闻】NBA前瞻:太阳背水一战!KD布克须爆发&艾顿也是关键
- 快资讯丨公开承认出轨陈小春!自曝交往细节,这位家喻户晓的女明星,不怕被封杀?
- 日媒:警方将以涉嫌违反火药类取缔法再次逮捕岸田遇袭案嫌疑人|新要闻
- 环球今日讯!天水市开展“爱鸟周”主题宣传活动
- 昆山高新区企业新蕴达:做老百姓用得起的靶向药|全球观热点
- 只差1胜!皇马有望诞生超级大赢家:年仅20岁,集齐6冠-每日报道
- 315曝光橄榄菜公司被罚没超400万,许可证被吊销
- 公交司机拾金不昧 大额存单完璧归赵
X 关闭