`

java NIO通信demo

 
阅读更多

server端

 

public class NIOServer {

	private Selector selector;
	public static void main(String[] args){
		NIOServer s = new NIOServer();
		s.initSelector();
		s.run();
	}
	
	public void run(){
		while(true){

			try{
				selector.select();
				Iterator it = selector.selectedKeys().iterator();
				while(it.hasNext()){
					SelectionKey key = (SelectionKey)it.next();
					it.remove();
					if(!key.isValid()){
						continue;
					}
					else if(key.isAcceptable()){
						accept(key);
					}
					else if(key.isReadable()){
						read(key);
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void read(SelectionKey key){
		SocketChannel sssc =(SocketChannel)key.channel();
		if(sssc.isOpen()&&sssc.isConnected()){
		System.out.println("read");
		new ReadThread(key).start();
		}
	}
	public void accept(SelectionKey key) throws Exception{
		System.out.println("有客户接入");
		ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
		SocketChannel sc = ssc.accept();
		sc.configureBlocking(false);
		sc.register(selector, SelectionKey.OP_READ);
	}
	public void initSelector(){
		try {
			selector = SelectorProvider.provider().openSelector();
			ServerSocketChannel channel = ServerSocketChannel.open();
			channel.configureBlocking(false);
			channel.socket().bind(new InetSocketAddress(8000));
			channel.socket().setReuseAddress(true);
			channel.register(selector, SelectionKey.OP_ACCEPT);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

 

监听线程:取得客户端连接

 

public class ReadThread extends Thread{

	private SocketChannel sc;
	private SelectionKey key;
	public ReadThread(SelectionKey key){
		this.key = key;
	}
	public void run() {
		String s = read();
		System.out.println("收到:"+s);
		if(s!=null&&!s.equals(""))
		write("you see:"+s);
	}

	public String read(){
		int cnt = 0;
		ByteBuffer bb = ByteBuffer.allocate(4000);
		sc = (SocketChannel)key.channel();
		String rt = "";
		try{
			while(sc.isConnected()&&sc.isOpen()&&(cnt = sc.read(bb))>0){
				String t = new String(bb.array(),"utf-8").trim();
				
				rt = rt+t;
				bb.clear();
			}
			return rt;
		}catch(Exception e){
			e.printStackTrace();
		}
		finally{
			key.cancel();
		}
		return null;
	}
	public void write(String str){
		try {
			if(sc.isConnected()&&sc.isOpen())
			sc.write(ByteBuffer.wrap(str.getBytes()));
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally{
			try {
				sc.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

 

 

客户端

 

public class NIOClient {

	Selector selector;
	SocketChannel sc ; 
	
	public void init(){
		try {
			selector = Selector.open();
			sc = SocketChannel.open();
			sc.connect(new InetSocketAddress("127.0.0.1",8000));
			sc.configureBlocking(false);
			sc.register(selector, SelectionKey.OP_READ);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void send(String str){
		try {
			if(sc.isConnected()){
				sc.write(ByteBuffer.wrap(str.getBytes()));
			}else{
				System.out.println("没有连接成功");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public String read(){
		ByteBuffer bb = ByteBuffer.allocate(4000);
		try {
			if(selector.select(1000)==1){
				Iterator it = selector.selectedKeys().iterator();
				while(it.hasNext()){
					String rt = "";
					SelectionKey k = (SelectionKey)it.next();
					it.remove();
					int cnt = 0;
					if(k.isReadable()){
						SocketChannel s = (SocketChannel)k.channel();
						while(s.isOpen()&&(cnt=s.read(bb))>0){
							rt += new String(bb.array()).trim();
							bb.clear();
						}
						s.close();
					}
					close();
					k.cancel();
					return rt;
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	public void close(){
		try {
			sc.close();
			selector.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args){
		NIOClient l = new NIOClient();
		l.init();
		l.send("eee");
		System.out.println(l.read());
	}
}

 

 

分享到:
评论

相关推荐

    JAVA-NIO-DEMO

    本示例"JAVA-NIO-DEMO"提供了关于Java NIO的实际应用,通过Anontion(注解)、Applet(小程序)和NIO的Demo,帮助开发者更深入地理解和掌握这些概念。 首先,让我们深入了解Java NIO。NIO的核心组件包括: 1. **...

    基于java NIO的socket通信demo

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

    java nio 通信服务器、客户端完整例子

    用java编写的nio通信的例子,nio是io编程的新版本,比io较流行。同时本例子是适用socket通信的。可以在此基础上,添加您的个人应用。本例子适用于:java通信的学习者,android平台通信的学习者。

    Nio非阻塞socket通信demo

    在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...

    bio nio aio demo

    在Java世界中,I/O(输入/输出)是任何应用程序不可或缺的部分。为了处理与外部世界的交互,Java提供了三种不同的I/O模型:BIO( Blocking I/O...这个"bio nio aio demo"项目是学习和比较Java I/O模型的一个宝贵实践。

    基于netty的nio使用demo源码

    Netty是一个高性能、异步事件...这个NioDemo示例代码可以帮助我们理解Netty如何利用NIO来实现高效的网络通信。通过阅读和分析源码,我们可以深入理解Netty的事件驱动模型、NIO机制以及如何在实际项目中应用这些概念。

    socket通信NIO代理模式demo实例

    本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的代理服务器。 代理模式是一种设计模式,它允许我们创建一个代理对象来控制对原对象的访问。在NIO代理模式中,代理服务器作为客户端与目标...

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    它不仅涉及到网络编程的基础知识,如套接字通信,还涵盖了多线程、并发控制以及高效数据传输的技巧,是学习和理解Java NIO体系结构的一个很好的实践案例。通过深入研究和分析这个项目,开发者能够更好地掌握NIO在...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    **NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...

    nio学习demo 处理因缓冲区满导致写入失败问题

    在Java的IO编程中,NIO(Non-blocking Input/Output,非阻塞输入输出)是一种高效的数据处理方式,尤其适用于高并发场景。本示例主要关注如何使用NIO解决“沾包”问题以及处理因缓冲区满导致的写入失败问题。首先,...

    java爬虫的DEMO的实现

    对于图片,Java爬虫可能会使用`java.net.URL`和`java.nio`包来下载图片流并将其保存到本地。而处理文档,如PDF或Word,可能需要用到第三方库,如Apache POI(处理Microsoft Office格式)或PDFBox(处理PDF)。这些库...

    服务端以NIO的方式处理请求的Demo

    在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,相较于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输方式,尤其适用于高并发、低延迟的场景。本Demo展示了如何在服务端...

    使用的java系统demo

    Java系统Demo可能涵盖了从基础的面向对象编程到复杂的框架集成,包括MVC模式、Spring Boot、MyBatis等,以及数据库交互、网络通信、多线程、并发控制等多个方面。它可能是为了教育目的,让学习者通过实际操作来加深...

    nettty+C#通信Demo

    【标题】:“netty+C#通信Demo”是一个关于如何实现Netty与C#之间通信的示例项目。这个Demo展示了如何使用这两个不同平台的技术进行高效、稳定的数据交换。 【描述】:这个Demo提供了实际操作的例子,说明了Netty...

    JavaIO和NIO练习

    在"JavaIODemo"这个练习中,我们可能会看到以下内容: 1. 流的创建与使用:演示如何创建输入流和输出流对象,例如从文件读取数据并写入到另一个文件。 2. 缓冲技术:使用BufferedReader和BufferedWriter实现高效的...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    Mina框架是一个轻量级的网络通信框架,基于Java NIO构建,它简化了网络编程的复杂性,提供了高效的I/O处理能力。Mina支持多种协议,如TCP、UDP等,适用于开发服务器端和客户端应用。Mina的核心组件包括IoSession...

    java基础练习demo

    NIO(New IO)是Java 1.4引入的新特性,提供了非阻塞IO和选择器,提高了性能和可伸缩性。`File`类用于文件操作,`BufferedReader`和`BufferedWriter`用于提高读写效率,而`ObjectInputStream`和`ObjectOutputStream`...

    服务端基于MINA2的UDP双向通信Demo演示(Java客户端)

    标题中的“服务端基于MINA2的UDP双向通信Demo演示(Java客户端)”是指使用Apache MINA框架在Java中实现的UDP(用户数据报协议)的双向通信示例。MINA是一个高性能、异步的网络应用程序框架,常用于构建网络服务,如...

    vc++ 与java通讯DEMO

    本示例“vc++ 与java通讯DEMO”提供了一个具体的案例,演示了如何使用VC++(Microsoft Foundation Classes)的MFC库与Java应用程序进行通信。下面将详细介绍这个DEMO中的关键知识点。 首先,我们要理解MFC。MFC是...

    bio-nio-aio.zip

    压缩包中的`demo3.txt`展示了如何使用NIO的`FileChannel`进行文件读写,而`demo4read.txt`和`demo4write.txt`则演示了如何利用`SocketChannel`进行网络通信。 三、反应器模式(Reactor) Reactor是Java NIO的一种...

Global site tag (gtag.js) - Google Analytics