Java网络编程从入门到精通(32):一个非阻塞I/O的例子

简介:
为了使读者更好地理解非阻塞I/O ,本节 给出了一个简单的例子用来演示如何将非阻塞I/O 应用到网络程序中。读者可以先不必管这个例子 的具体细节。因为这个例子的主要目的并不是讲解非阻塞I/O 的使用,而是先让读者对非阻塞I/O 有一个笼统的感性认识。在看完这个例子后,读者可能会有很多疑问,在本章后面的部分将会逐渐揭开这些迷团。这个例子 的主要功能是访问新浪网,并将新浪网的首页在控制台上输出。
package  test;

import  java.net. * ;
import  java.nio. * ;
import  java.nio.channels. * ;
import  java.io. * ;

public   class  FirstNonBlockingIO
{
    
public   static   void  main(String[] args)  throws  Exception
    {
        SocketAddress remote 
=   new  InetSocketAddress( " www.sina.com.cn " 80 );
        SocketChannel channel 
=  SocketChannel.open(remote);
        String request 
=   " GET / HTTP/1.1\r\n "   +  
                         
" Host:www.sina.com.cn\r\n "   +
                         
" Connection:close\r\n\r\n " ;
        ByteBuffer header 
=  ByteBuffer.wrap(request.getBytes());
        channel.write(header);        
        ByteBuffer buffer 
=  ByteBuffer.allocate( 1024 );
        WritableByteChannel out 
=  Channels.newChannel(System.out);
        
while  (channel.read(buffer)  !=   - 1 )
        {
            buffer.flip();
            out.write(buffer);
            buffer.clear();
        }
        channel.close();
    }
}
测试

   执行如下命令:

java test.FirstNonBlockingIO  >  sina.txt

  打开sina.txt后,会看到如下的文件内容:

HTTP/ 1.0   200  OK
Date: Sun
,   01  Apr  2007   06 : 53 : 50  GMT
Server: Apache/
2.0.58  (Unix)
Last-Modified: Sun
,   01  Apr  2007   06 : 50 : 47  GMT
Connection: close
 
 
</body>
</html>

    由于新浪网的主页内容太多,因此,为了方便查看程序运行结果,使用输出重定向符“>”将本该输出到控制台的内容输出到sina.txt文件中。从例程7-1可以看出,主要有三点和同步I/O存在差异。

1.  连接服务器(第013行)。使用SocketChannel类,而不是Socket类。
2.  向服务端写数据(第018行)。 使用SocketChannel类中的write方法,而不是OutputStream。
3.  从服务端读数据(第021行)。使用SocketChannel类中的read方法,而不是InputStream。

   除了上面的三点外,在本例中还使用了缓冲区来处理输入输出数据。因此,通道(Channels)和缓冲区(Buffers)是学习非阻塞I/O之前必须掌握的知识。在下面的文章等将详细讲解这两部分的内容。





 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214333 ,如需转载请自行联系原作者
相关文章
|
30天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
48 3
|
18天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
9天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
15天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
21天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
61 5
|
18天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
30 1
|
25天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
26天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
28天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
44 4
|
27天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
21 1

热门文章

最新文章

下一篇
无影云桌面