NIO

1.nio的模拟

/**
 * @description TODO
 * @author fangHao
 * @date 2020年7月8日
 */
public class TomcatServer {
	static ByteBuffer buffer=ByteBuffer.allocate(512);
	static List<SocketChannel> cList=new ArrayList<SocketChannel>();

	/**
	 * @description TODO
	 * @return void
	 * @date 2020年7月8日
	 */
	public static void main(String[] args) {
		try {
			ServerSocketChannel serverSocket=ServerSocketChannel.open();
			SocketAddress socketAddress=new InetSocketAddress("127.0.0.1", 8080);
			serverSocket.bind(socketAddress);
			serverSocket.configureBlocking(false);
			while (true) {
				for(SocketChannel socketChannel:cList) {
					int read = socketChannel.read(buffer);
					if(read > 0) {
						buffer.flip();
						byte[] bs=new byte[read];
						buffer.get(bs);
						String contentString=new String(bs);
						System.out.println(contentString);
						buffer.flip();
					}
				}
				SocketChannel accept = serverSocket.accept();
				if(null != accept) {
					accept.configureBlocking(false);
					cList.add(accept);
				}
			}
		} catch (Exception e) {
			
		}

	}

}

selector

/**
 * @description nio
 * @author fangHao
 * @date 2020年7月8日
 */
public class TomcatServer {
	static ByteBuffer buffer=ByteBuffer.allocate(512);
	static List<SocketChannel> cList=new ArrayList<SocketChannel>();
	
	static Selector selector=null;
	/**
	 * @description 主函数
	 * @return void
	 * @date 2020年7月8日
	 */
	public static void main(String[] args) {
		try {
			ServerSocketChannel serverSocket=ServerSocketChannel.open();
			SocketAddress socketAddress=new InetSocketAddress("127.0.0.1", 8080);
			serverSocket.bind(socketAddress);
			serverSocket.configureBlocking(false);
			 selector=Selector.open();
			serverSocket.register(selector, SelectionKey.OP_ACCEPT);
			
			while (true) {
				while(selector.select(0) > 0) {
					Set<SelectionKey> selectedKeys = selector.selectedKeys();
					Iterator<SelectionKey> iterator = selectedKeys.iterator();
					while (iterator.hasNext()) {
						SelectionKey key = iterator.next();
						iterator.remove();
						if(key.isAcceptable()) {
							acceptHandler(key);
						}else if (key.isReadable()) {
							readHandler(key);
						}
					}
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void acceptHandler(SelectionKey key) {
		ServerSocketChannel channel = (ServerSocketChannel) key.channel();
		try {
			SocketChannel accept = channel.accept();
			accept.configureBlocking(false);
			ByteBuffer buffer=ByteBuffer.allocate(1024);
			accept.register(selector, SelectionKey.OP_READ, buffer);
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
	
	public static  void readHandler(SelectionKey key) {
		SocketChannel client = (SocketChannel) key.channel();
		ByteBuffer buffer=(ByteBuffer) key.attachment();
		buffer.clear();
		while(true) {
			try {
				int read=client.read(buffer);
				if(read > 0) {
					buffer.flip();
					while(buffer.hasRemaining()) {
						client.write(buffer);
					}
					buffer.clear();
				}else if (read == 0) {
					break;
				}else  {
					client.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

模拟Netty

/**
 * @description TODO
 * @author fangHao
 * @date 2020年7月9日
 */

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class NettyDemo {
	private ServerSocketChannel server=null;
	private Selector selector1=null;
	private Selector selector2=null;
	private Selector selector3=null;
	
	int port = 9090;
			
	public void initServer() {
		try {
			server=ServerSocketChannel.open();
			server.configureBlocking(false);
			server.bind(new InetSocketAddress(port));
		
			selector1=Selector.open();
			selector2=Selector.open();
			selector3=Selector.open();
			server.register(selector1, SelectionKey.OP_ACCEPT);
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args) {
		NettyDemo nettyDemo=new NettyDemo();
		nettyDemo.initServer();
		NioThread t1 = new NioThread(nettyDemo.selector1, 2);
		NioThread t2 = new NioThread(nettyDemo.selector2);
		NioThread t3 = new NioThread(nettyDemo.selector3);
		t1.start();
		try {
			TimeUnit.SECONDS.sleep(1);
			
		} catch (InterruptedException e) {
			
			e.printStackTrace();
		}
		t2.start();
		t3.start();
		System.out.println("服务器启动了。。。。。");
	}
}

class NioThread extends Thread{
	Selector selector=null;
	static int selectors=0;
	int id= 0;
	boolean boss= false;
	static LinkedBlockingQueue<SocketChannel>[] queue;
	static AtomicInteger idx=new AtomicInteger();
	
	NioThread(Selector sel , int n){
		this.selector=sel;
		this.selectors = n;
		boss =true;
		queue=new LinkedBlockingQueue[selectors];
		for (int i = 0; i < n; i++) {
			queue[i] =new LinkedBlockingQueue<SocketChannel>();
		}
	}
	NioThread(Selector sel){
		this.selector=sel;
		id=idx.getAndIncrement() % selectors;
	}
	
	@Override
	public void run() {
		while(true) {
			try {
				while(selector.select(10) > 0) {
					Set<SelectionKey> selectedKeys = selector.selectedKeys();
					Iterator<SelectionKey> iterator = selectedKeys.iterator();
					while (iterator.hasNext()) {
						SelectionKey key = iterator.next();
						iterator.remove();
						if(key.isAcceptable()) {
							acceptHandler(key);
						}else if (key.isReadable()) {
							readHandler(key);
						}
					}
				}
				
				if(!boss && !queue[id].isEmpty()) {
					ByteBuffer buffer=ByteBuffer.allocate(2929);
					SocketChannel client = queue[id].take();
					client.register(selector, SelectionKey.OP_READ,buffer);
					System.out.println("新客户端"+client.socket().getPort()+"分配到"+id);
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	/**
	 * @description TODO
	 * @return void
	 * @date 2020年7月9日
	 */
	private void readHandler(SelectionKey key) {
		SocketChannel client = (SocketChannel) key.channel();
		ByteBuffer buffer=(ByteBuffer) key.attachment();
		buffer.clear();
		while(true) {
			try {
				int read=client.read(buffer);
				if(read > 0) {
					buffer.flip();
					while(buffer.hasRemaining()) {
						client.write(buffer);
					}
					buffer.clear();
				}else if (read == 0) {
					break;
				}else  {
					client.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
		

	/**
	 * @description 
	 * @return void
	 * @date 2020年7月9日
	 */
	private void acceptHandler(SelectionKey key) {
		ServerSocketChannel channel = (ServerSocketChannel) key.channel();
		try {
			SocketChannel accept = channel.accept();
			accept.configureBlocking(false);
			int num=idx.getAndIncrement() % selectors;
			queue[num].add(accept);
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
08-10
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值