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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Java网络编程从入门到精通(31):非阻塞I/O简介 为了使读者更好地理解非阻塞I/O,本节给出了一个简单的例子用来演示如何将非阻塞I/O应用到网络程序中。

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(31):非阻塞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之前必须掌握的知识。在下面的文章等将详细讲解这两部分的内容。

下一篇:Java网络编程从入门到精通(33):非阻塞I/O的缓冲区(Buffer)



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
1月前
|
网络协议 算法 Java
|
1月前
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南
|
2月前
|
Java
网络 I/O:单 Selector 多线程(单线程模型)
网络 I/O:单 Selector 多线程(单线程模型)
|
2月前
|
Java
如何理解网络阻塞 I/O:BIO
如何理解网络阻塞 I/O:BIO
|
2月前
|
存储 消息中间件 监控
一文搞懂常见的网络I/O模型
一文搞懂常见的网络I/O模型
39 0
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
2天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
21 0
|
29天前
|
网络协议 安全 Java
Java网络编程
Java网络编程
C4.
|
1月前
|
Java
Java网络编程
Java网络编程
C4.
15 0
|
1月前
|
Java
【Java】深入了解Java I/O 流
【Java】深入了解Java I/O 流
31 0