`
QING____
  • 浏览: 2255307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIO部分:DatagramChannel实例

 
阅读更多
package com.test.socket;

import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.charset.Charset;
import java.util.Iterator;

public class DatagramChannelTestMain {
	private static final int port = 30008;
	private static final int TIMEOUT = 3000;

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Thread serverThread = new ServerThread();
		serverThread.start();
		Thread clientThread = new ClientThread();
		clientThread.start();
		Thread.sleep(2000);
	}

	static class ServerThread extends Thread {

		@Override
		public void run() {
			DatagramChannel channel = null;
			try {
				channel = DatagramChannel.open();
				channel.configureBlocking(false);
				DatagramSocket socket = channel.socket();
				socket.bind(new InetSocketAddress(port));
				Selector selector = Selector.open();
				channel.register(selector, SelectionKey.OP_READ);
				while(selector.isOpen()){
					System.out.println("S....!!!");
					if(selector.select() == 0){//select must be
						System.out.println("s....");
						Thread.sleep(2000);
						continue;
					}
					Iterator<SelectionKey> it = selector.selectedKeys().iterator();
					while(it.hasNext()){
						SelectionKey key = it.next();
						if(key.isValid() && key.isReadable()){
							read(key);
						}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(channel != null){
					try{
						channel.close();
					}catch (Exception ex) {
						ex.printStackTrace();
					}
				}
			}
		}

		private void read(SelectionKey key) throws Exception {
			DatagramChannel channel = (DatagramChannel)key.channel();
			System.out.println("channel" + channel.toString());
			ByteBuffer byteBuffer = ByteBuffer.allocate(256);
			InetSocketAddress address = (InetSocketAddress)channel.receive(byteBuffer);
			if(address == null){
				System.out.println(".....");
			}else{
				System.out.println(address.getAddress() + "//" + address.getPort());
			}
			byteBuffer.flip();
			Charset charset = Charset.defaultCharset();
			CharBuffer charBuffer = charset.decode(byteBuffer);
			System.out.println("Server read:" + charBuffer.toString());
			//if write,please here.
			byteBuffer = charset.encode("this is server sent!");
			channel.send(byteBuffer, address);
			key.interestOps(SelectionKey.OP_READ);
		}

	}

	static class ClientThread extends Thread {
		@Override
		public void run() {
			DatagramChannel channel = null;
			try {
				channel = DatagramChannel.open();
				channel.configureBlocking(false);
				channel.connect(new InetSocketAddress("10.12.124.19",port));
				while(!channel.isConnected()){
					System.out.println("....");
				}
				Selector selector = Selector.open();
				channel.register(selector, SelectionKey.OP_WRITE);
				while(selector.isOpen()){
					if(selector.select() == 0){
						Thread.sleep(2000);
						continue;
					}
					Iterator<SelectionKey> it = selector.selectedKeys().iterator();
					while(it.hasNext()){
						SelectionKey key = it.next();
						if(key.isValid() && key.isWritable()){
							write(key);
						}else if(key.isReadable()){
							read(key);
						}
					}
				}
			}catch (Exception e) {
				e.printStackTrace();
			}finally{
				if(channel != null){
					try{
						channel.close();
					}catch(Exception ex){
						ex.printStackTrace();
					}
				}
			}
		}
		
		private void write(SelectionKey key) throws Exception{
			DatagramChannel channel = (DatagramChannel)key.channel();
			Charset charset = Charset.defaultCharset();
			ByteBuffer byteBuffer = charset.encode("this is client sent!");
			System.out.println("p:" + byteBuffer.position() + "//l:" + byteBuffer.limit());
			while(byteBuffer.hasRemaining()){
				channel.write(byteBuffer);
			}
			System.out.println("cw ok!");
			key.interestOps(SelectionKey.OP_READ);
		}
		
		private void read(SelectionKey key) throws Exception{
			DatagramChannel channel = (DatagramChannel)key.channel();
			Charset charset = Charset.defaultCharset();
//			ByteBuffer byteBuffer = charset.encode("this is client sent!");
//			System.out.println("p:" + byteBuffer.position() + "//l:" + byteBuffer.limit());
			ByteBuffer byteBuffer = ByteBuffer.allocate(256);
			while(channel.read(byteBuffer) > 0){
				//
			}
			byteBuffer.flip();
			CharBuffer charBuffer = charset.decode(byteBuffer);
			System.out.println("Client read:" + charBuffer.toString());
			key.interestOps(SelectionKey.OP_WRITE);
		}
	}
}

 

分享到:
评论

相关推荐

    Java NIO原理分析及代码实例

    Java NIO(New IO)是Java 1.4版本引入的一个新API,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO...在实际编码时,参考博文链接中的代码实例,可以帮助你更好地理解和实践Java NIO。

    Java NIO实例UDP发送接收数据代码分享

    "Java NIO实例UDP发送接收数据代码分享" Java NIO(Non-blocking I/O)是一种异步I/O模型,允许开发者在单个线程中处理多个I/O操作,从而提高程序的性能和可扩展性。在Java NIO中,DatagramChannel是专门用于发送...

    java nio 尚硅谷 12讲 new

    在尚硅谷的12讲课程中,这些知识点将通过实例演示和详细解释,让学习者掌握Java NIO的精髓,并能够实际应用到项目开发中,提升系统的性能和并发处理能力。通过系统学习,开发者将更好地理解Java NIO的优势,并能在...

    DatagramChannelImpl.rar_java nio

    1. **打开和关闭通道**:你可以通过`DatagramChannel.open()`方法创建一个新的`DatagramChannel`实例,用于处理UDP通信。当不再需要该通道时,可以调用`close()`方法关闭它,释放相关资源。 2. **绑定地址**:使用`...

    java nio教程pdf

    7. Java NIO应用实例: - 在聊天服务器案例中,使用选择器能够实现用一个线程监听和处理多个通道中的数据传输,使得程序结构更为简洁。 - 通过注册通道到选择器并监听事件,可以实现高效的网络应用,比如聊天...

    java NIO原理和使用

    #### 三、Java NIO 使用实例 下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io....

    Java_NIO_API详解

    它提供了四个静态工厂方法来创建不同的ByteBuffer实例: - `allocate(int capacity)`:创建一个常规的Heap ByteBuffer。 - `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接...

    nio学习文档及代码

    `nio-src.rar`文件中可能包含了一些NIO的示例代码,包括如何创建和操作通道、缓冲区以及选择器的实例,通过阅读和运行这些代码,可以帮助开发者深入理解NIO的工作原理和使用方法。 **8. 学习路径** 学习NIO,首先应...

    JavaNIOpdf书籍

    9. **实际应用示例**:书籍中会包含大量实例,展示如何在实际项目中应用NIO,例如构建高性能的Web服务器、文件复制服务等。 10. **NIO与BIO的比较**:对比两种I/O模型的优缺点,帮助读者理解何时选择NIO,何时使用...

    快速了解Java中NIO核心组件

    * DatagramChannel:UDP 协议网络通信 * SocketChannel:TCP 协议网络通信 * ServerSocketChannel:监听 TCP 连接 Buffer Buffer 是 NIO 中所使用的缓冲区,它不是一个简单的 byte 数组,而是封装过的 Buffer 类。...

    Java-NIO之Selector.doc

    Java NIO(非阻塞I/O)中的Selector是一个核心组件,它允许单个线程处理多个通道(channels)上的I/O事件。Selector的角色就像一个交通指挥员,能够监控多个通道并...理解并熟练使用Selector是掌握Java NIO的关键部分。

    Netty UDP协议网络打洞实例

    通过`NioDatagramChannel`,我们可以监听和发送UDP数据包。 2. **配置Bootstrap**: 使用`Bootstrap`类来配置我们的客户端或服务器端。设置事件循环组、处理器管道以及连接配置。 3. **添加Handler**: 在处理器管道...

    基于netty4 的udp字节数据接收服务

    在 Netty 中,我们可以使用 `NioDatagramChannel` 类来处理 UDP 通信。 创建 UDP 接收服务的关键步骤如下: 1. **初始化 Bootstrap**:首先,我们需要创建一个 `Bootstrap` 实例,这是 Netty 中启动服务器的基本...

    032002_【第20章:Java新IO】_通道(Channel)_java_hearing3oc_扣弄你澳大_stoppedh

    `java.hearing3oc`可能是指一个特定的教程系列或者代码示例集合,用于教授Java NIO的相关知识,`扣弄你澳大`这部分可能是误输入或者某种特定的表述,不直接影响知识点的解释。 通道接口包括以下常见的实现类: - *...

    咕泡学院_Tom_JavaVIP课程_深入分析Netty源码1

    根据不同的协议和I/O模型,Netty提供了多种Channel实现,如NioServerSocketChannel用于服务器端TCP连接,NioDatagramChannel用于UDP连接等。 3. **Handler配置**: 在ChannelPipeline中添加各种处理器(Handler),...

    Java Socket编程实例(五)- NIO UDP实践

    在NIO UDP客户端的实现中,通常需要创建一个`DatagramChannel`,并注册到`Selector`上,设置为监听`OP_READ`事件。当`Selector`选择键变为可读时,客户端可以发送数据到服务器,然后读取服务器的响应。客户端的代码...

    异步通信核心简单实现(Java)

    例如,SocketChannel、FileChannel和DatagramChannel是常见的通道类型。通过注册通道到选择器,我们可以监控多个通道的状态。 3. **选择器(Selector)**: 选择器是NIO中的关键组件,它允许单个线程检查多个通道...

Global site tag (gtag.js) - Google Analytics