`
fokman
  • 浏览: 239140 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java nio Server实现

阅读更多

Java NIO 提供了反应堆模式非阻塞的Socket通信,代码很简单

public class TcpServer implements Runnable {
	
	private ServerSocketChannel socketChannel;
	private Selector selector;
	private int activeSockets;
	private int port;
	
	public TcpServer(){
		activeSockets = 0;
		port = 9999;
		try {
			socketChannel = ServerSocketChannel.open();
			selector = Selector.open();
			ServerSocket socket = socketChannel.socket();
			socket.bind(new InetSocketAddress(port));
			socketChannel.configureBlocking(false);
			socketChannel.register(selector, SelectionKey.OP_ACCEPT);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(true){
			try {
				selector.select();
			} catch (IOException e) {
				continue;
			}
			Set<SelectionKey> keys = selector.selectedKeys();
			activeSockets = keys.size();
			if(activeSockets==0){
				continue;
			}
			
			for(SelectionKey key:keys){
				if(key.isAcceptable()){
					doServerSocketEvent(key);
					continue;
				}
				if(key.isReadable()){
					doClientReadEvent(key);
					continue;
				}
				if(key.isWritable()){
					doClientWriteEvent(key);
					continue;
				}
			}
		}
	}

	private void doServerSocketEvent(SelectionKey key) {
		SocketChannel client = null;
		ServerSocketChannel server = (ServerSocketChannel)key.channel();
		try {
			client = server.accept();
			if(client == null){
				return;
			}
			client.configureBlocking(false);
			client.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
		} catch (IOException e) {
			try {
				client.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	private void doClientWriteEvent(SelectionKey key) {
		SocketChannel socketChannel = (SocketChannel)key.channel();
		ByteBuffer buffer = ByteBuffer.allocate(10);
		byte[] data = "0000000000".getBytes();
		buffer.put(data);
		buffer.flip();
		try {
			socketChannel.write(buffer);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void doClientReadEvent(SelectionKey key) {
		ByteBuffer receiveBuffer;
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		SocketChannel socketChannel = (SocketChannel)key.channel();
		if(socketChannel.isOpen()){
			int nBytes = 0;
			buffer.clear();
			try {
				nBytes = socketChannel.read(buffer);
			} catch (IOException e) {
				e.printStackTrace();
			}
			buffer.flip();
			if (nBytes > 0) {
				receiveBuffer = ByteBuffer.allocate(nBytes);
				receiveBuffer.clear();
				buffer.get(receiveBuffer.array());
				receiveBuffer.flip();
			}
		}
	}

	public static void main(String[] args) {
		TcpServer server = new TcpServer();
		new Thread(server).start();
	}
}
 
分享到:
评论

相关推荐

    java nio im(server+client)

    java基于nio的通信实例,带UML结构图及server、client源码。

    NioServer.java

    NioServer.java

    Ioserver java Nio socket 框架

    Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser

    一个基于事件驱动的JAVA NIO 服务器源码!

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

    java nio and reactor

    java nio 作者的ppt。 How to Build a Scalable ...文中讲述如何使用java nio来实现高性能的服务器。 1、建立高性能服务器遇到问题? 2、java nio 和 reactor 的映射关系 3、如果使用java nio 来实现高性能服务器

    java nio教程pdf

    Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...

    nioserver.rar_NIO_java nio

    NIO非阻塞通讯模式!NIO非阻塞通讯模式!

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 ...4,修改封装http做成短连接处理,就是一个小型的webserver,或者结合java2D和robot做远程监控 5,封装自己的协议可以做成自己需要的服务器端程序,

    实现java网络与nio例子

    实现java nio的标准例子,包括server端和client端。

    JAVA NIO客户端服务端完整项目工程(ServerandClientNIOV1.0.zip)包下载.txt

    该JAVA NIO项目包含server服务端完整项目源码、client客户端项目工程源码。

    java nio server-开源

    小型简单但完整的Java NIO服务器,任何人都可以免费使用。 目前,它仅处理发送和接收字符串,并且尚未进行优化-但它易于理解并适应您的需求。

    Java NIO原理和使用

    Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。 Java NIO...

    Java应用服务器Java-Nio-Services.zip

    JAVA服务器基于JAVA NIO I. 实现HTTP协议 II. 实现HTTPS协议 III. 实现FASTCGI协议(Client端) 运行HTTP/HTTPS服务器 运行开发包下jar文件 java -jar http-server-version-{version}.jar   ...

    nioserver.zip

    同时整个服务端的流程处理,建立于事件机制上。在 [接受连接->读->业务处理->写 ->关闭连接 ]这个 过程中,触发器将触发相应事件,由事件处理器对相应事件分别响应,完成服务器端的业务处理。...

    java NIO socket聊天

    java NIO 高性能 socket通讯,服务端采用单线程,降低了cpu的压力,普通io socket通讯,server需要每个连接运行个线程,容易出现问题,效率也低

    NIO实现telnet

    use telnet as client , and implements server using nio

    Java NIO 聊天室 JSwing

    import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser; import com.nio.user.ClientUserManager; import com.nio.user.UserData; public class NIOClient { ...

    java_Nio_server_and_j2me_client.rar_J2ME SERVER_NIO_j2me_j2me ni

    java nio 服务器范例及j2me代码连接服务器的测试代码。

Global site tag (gtag.js) - Google Analytics