`

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 通信服务器、客户端完整例子

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

    基于java NIO的socket通信demo

    java NIO 创建的服务端,能够异步响应客户端的请求,客户端采用nio异步请求服务端,通信之间的乱码使用charset解决

    Nio非阻塞socket通信demo

    本人写的Nio非阻塞socket通信demo,内有注释。

    socket通信NIO代理模式demo实例

    socket通信nio模式有很多实现方式,但是在性能上、资源上一般很少考虑,这里封装了一个性能极强的程序。

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

    本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的Java客户端源码实现,详见:http://www.52im.net/thread-373-1-1.html

    java高手真经 光盘源码

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    Android-netty和socket通信的demo

    Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用

    Java高手真经(编程基础卷)光盘全部源码

    javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    java原始码Java套接字I / O:阻塞,非阻塞和异步 介绍 在描述I / O时,术语“非阻塞”和“异步”通常可以互换使用,但是它们之间存在显着差异。 本文描述了Java中非阻塞和异步套接字I / O操作之间的理论和实践差异。...

    基于Netty框架的demo项目

    项目中,你可以清晰地看到BIO与NIO模型在Netty中的灵活运用,如何通过Netty的高性能特性来优化网络通信。此外,demo还详细展示了如何通过自定义编解码器处理网络通信中的数据编解码问题,以及如何利用心跳机制确保...

    Java源码,可运行的实战SpringBoot服务源码(实战中总结测试)

    「喜欢的自提」 可以直接运行的代码,里面是我在工作中用来学和和测试的代码,一般是得到想要的测试结果,就直接用于实战项目中...17、BIO、NIO、AIO、Reactor、netty相关学习总结和测试(客户端/服务端通信测试demo)

    netty5服务端和客户端通讯的demo

    利用idea,构建的maven项目,用idea打开即可测试运行,实现了netty的服务段和客户端,利用netty实现服务端和客户端的通信demo.

    spring-boot示例项目

    RocketMQ|[Spring Cloud Alibaba(五)RocketMQ 异步通信实现](https://github.com/smltq/spring-boot-demo/blob/master/cloud-alibaba/README5.md) ### 其它 模块名称|主要内容 ---|--- leetcode|[力扣题解...

    HP-Socket下载

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口...

    netty:netty 练习项目

    nettynetty 练习项目netty : 由jboss开发的基于JavaNIO(IO多路复用或异步IO)采用ReacotrIo设计模式的高性能,高伸缩性的网络通信框架,用来开发高性能网络应用程序

    微信小程序之WebSocket

    笔者本人比较喜欢使用tornado,做了几年后台开发,使用最多的框架之一的就是它,NIO模型,而且非常轻量级,同样的rps,java可能需要700-800M的内存,tornado只要30-40M,所以在一台4G内存的机子上可以跑上百个...

Global site tag (gtag.js) - Google Analytics