`
Fly_m
  • 浏览: 259408 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java nio Selector的使用-客户端

阅读更多

  接上一篇,客户端的程序就相对于简单了,只需要负责连接,发送下载文件名,再读数据就行了。主要步骤就是注册->连接服务器->发送下载请求->读数据->断开连接。

  第一步:注册,并注册connect事件。

if(selector == null)
	selector = Selector.open();
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress("localhost", 1234));
channel.register(selector, SelectionKey.OP_CONNECT);

 

  以上步骤,在实际中发现configure和connet并不能随意交换位置,即不能将connect放在configureBlocking的前面,更不能在open中直接添加InetSocketAddress参数了。在官方doc中,open(InetAddress)的解释是“这种便捷方法的工作方式就像以下过程一样:调用 open() 方法、在得到的套接字通道上调用 connect 方法、向其传递 remote,然后返回该通道。”,但不知道为什么在connect之后,就不能配置block了,导致无法进行数据下载和通信。

 

  第二步:处理connect事件

//连接事件
if(key.isConnectable()) {
	SocketChannel socketChannel = (SocketChannel) key.channel();
	if(socketChannel.isConnectionPending())
		socketChannel.finishConnect();
	socketChannel.write(ByteBuffer.wrap(serverFileName.getBytes()));//向服务器发信息,信息中即服务器上的文件名
	socketChannel.register(selector, SelectionKey.OP_READ);
}

 

  在以上步骤中,要完成连接之后,向服务器端发送了下载的文件名的数据信息,并注册read事件。服务器端在接收到相应文件名之后,就开启write事件向客户端进行发送数据了,客户端此时就可以进行数据读取了。

  

  第三步:处理read事件

if(key.isReadable()) {
	SocketChannel socketChannel = (SocketChannel) key.channel();
	byteBuffer.clear();
	if(!socketChannel.isConnected())
		return null;
//向本机下载文件创建文件channel
	if(fileChannel == null)
		fileChannel = new RandomAccessFile(localFileName, "rw").getChannel();
	int r = socketChannel.read(byteBuffer);
//如果文件下载完毕,则关掉channel,同时关掉socketChannel
	if(r <= 0) {
		if(fileChannel != null)
			fileChannel.close();
		channel.close();
		key.cancel();
		return null;
	}
	byteBuffer.flip();
//写到下载文件中
	fileChannel.write(byteBuffer);
}

 

  就是处理读信息,如果数据已经读取完毕,则完成相应下载保存文件的文件流,并退出程序。

 

  这样,整个客户端就完成了,在运行时,我同时启用10个线程来向服务器端读同一个文件,并保存为不同的文件备份,以达到模拟数据传输的功能。如下所示:

ExecutorService executorService = Executors.newSingleThreadExecutor();
for(int i = 0; i < 10; i++) {
	executorService.submit(new DownloadClient<Object>("d:/log4j.log", "d:/down" + i + ".log"));
}
executorService.shutdown();

 

  整个selector仅是一个作为练习用的小例子,如果用在实际代码中,还需要处理不同的异常和相应的逻辑等。对于学习还是有一定的帮助的。希望对你有用。

  随附客户端代码。

分享到:
评论
1 楼 rustlingwind 2010-05-25  
写的很好,谢谢!

相关推荐

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-...23-Java NIO-Selector-示例代码(客户端).mp4 24

    【IT十八掌徐培成】Java基础第27天-04.NIO-Selector-Server-Client.zip

    课程中的视频文件"Java基础第27天-04.NIO-Selector-Server-Client.avi"很可能包含了实际的代码演示和讲解,帮助学习者直观理解Selector的工作原理以及如何在Java中实现NIO服务器和客户端的交互。通过观看视频和动手...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    Java NIO(Non-blocking Input/...在实际开发中,Java NIO的使用需要对多线程、网络编程以及NIO API有深入的理解。通过这种方式构建的系统可以高效地处理大量并发连接,非常适合于聊天、游戏等实时性要求高的应用场景。

    java nio Selector的使用-服务器端

    Selector是Java NIO中的核心组件,用于监听多个通道的事件,如连接建立、数据可读、写空等。在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的...

    java网络编程NIO视频教程

    Java NIO-Selector-示例代码(客户端) - **主要内容**:提供客户端使用Selector的示例代码。 - **学习目标**:掌握客户端多路复用的实现。 #### 24. Java NIO-Selector-示例代码(服务端) - **主要内容**:提供...

    JAVA NIO 异步通信客户端

    在描述中提到的"JAVA NIO 异步通信客户端"是指使用NIO API实现的一个客户端程序,它能够在不阻塞主线程的情况下进行网络通信。这通常通过使用Selector和Channel来完成。Selector负责监控多个通道的状态变化,而...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    在NIO服务端编程中,通常会使用`Selector`来监听多个通道的事件,当有新的连接、数据可读或写操作完成时,`Selector`会通知程序,从而避免了传统IO模型中必须为每个连接创建一个线程的开销。 标签“nio nio-socket ...

    Java NIO非阻塞服务端与客户端相互通信

    本教程将深入讲解如何使用Java NIO实现非阻塞服务端与客户端的通信。 1. **Java NIO基础** - **通道(Channels)**:NIO中的通道类似于传统IO的流,但它们可以同时读写,并且支持非阻塞操作。 - **缓冲区...

    基于matrix-nio和nio-template构建的管理员和个人协助.zip

    1. **连接管理**:使用Matrix-NIO处理来自客户端的连接请求,进行高效的连接管理和维护。 2. **消息处理**:对收到的消息进行解码,执行相应的业务逻辑,然后将响应编码后发送回客户端。 3. **并发支持**:利用NIO的...

    Java NIO Selector用法详解【含多人聊天室实例】

    Selector是Java NIO中的关键组件,用于实现多路复用,即单个线程可以监控多个通道(Channel)的事件,例如读取、写入或连接等。 1. Java NIO Channel与Buffer Channel代表I/O操作的源或目标,如文件、套接字等。...

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。...学习和理解Java NIO以及Netty的使用,对于提升Java网络编程的能力至关重要。

    java NIO实例

    `NIOServer.java`和`NIOClient.java`这两个文件很可能是用于演示Java NIO服务器端和客户端的基本操作。下面将详细介绍Java NIO的主要组件和工作原理,并结合这两个文件名推测它们可能包含的内容。 1. **Selector...

    【IT十八掌徐培成】Java基础第27天-02.NIO-ServerSocketChannel-SocketChannel.zip

    总的来说,本教程将围绕ServerSocketChannel和SocketChannel展开,讲解如何在Java NIO框架下创建服务器并接受客户端连接,以及如何通过非阻塞的方式进行数据交换,这对于我们理解和掌握Java NIO编程至关重要。...

    java nio 实现socket

    在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O模型**:在传统的Java IO编程中,当我们调用`read()`或`write()`方法时,...

    基于java NIO的socket通信demo

    在这个“基于java NIO的socket通信demo”中,我们将探讨如何使用NIO进行服务器和客户端的Socket通信,并解决通信过程中的字符集乱码问题。 首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端...

    java NIO推送实例

    在这个实例中,"java NIO 消息推送实例" 旨在展示如何使用NIO进行服务器向客户端的消息推送。 1. **Java NIO基础** - **通道(Channels)**:Java NIO 提供了多种通道,如文件通道、套接字通道等,它们代表不同...

Global site tag (gtag.js) - Google Analytics