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

NIO socket服务端

    博客分类:
  • java
阅读更多
public class ZZSocketServer extends Thread {

   private final int PORT=8899;
   private final int BLOCK=1024*2;
   /*接受数据缓冲区*/
    private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);
	/*发送数据缓冲区*/
	private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);

   private  Selector selector;
   
   
   public ZZSocketServer(){
	    // 打开服务器套接字通道
		ServerSocketChannel serverSocketChannel;
		try {
			serverSocketChannel = ServerSocketChannel.open();
			// 服务器配置为非阻塞
			serverSocketChannel.configureBlocking(false);
			// 检索与此通道关联的服务器套接字
			ServerSocket serverSocket = serverSocketChannel.socket();
			// 进行服务的绑定
			serverSocket.bind(new InetSocketAddress(PORT));
			// 通过open()方法找到Selector
			selector = Selector.open();
			// 注册到selector,等待连接
			serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
			System.out.println("Server 8899 Port Start----"+PORT);
		} catch (IOException e) {
			//e.printStackTrace();
		}
		
   }
   
   public void run(){
	   
	   while(true){
		   try {
			selector.select();
			// 返回此选择器的已选择键集。
			Set<SelectionKey> selectionKeys = selector.selectedKeys();
			System.out.println("===selectionKeys.Size=="+selectionKeys.size());
			// 接受请求
			ServerSocketChannel server = null;
			SocketChannel client = null;
			for (SelectionKey selectionKey : selectionKeys) {
				if (selectionKey.isAcceptable()) {
					// 返回为之创建此键的通道。
					server = (ServerSocketChannel) selectionKey.channel();
					// 接受到此通道套接字的连接。
					// 此方法返回的套接字通道(如果有)将处于阻塞模式。
					client = server.accept();
					// 配置为非阻塞
					client.configureBlocking(false);
					// 注册到selector,等待连接
					client.register(selector, SelectionKey.OP_READ);
			    }
				else if (selectionKey.isReadable()){
					handleKey(selectionKey);
				}
			}
			/*Iterator<SelectionKey> iterator = selectionKeys.iterator();
			while (iterator.hasNext()) {		
				SelectionKey selectionKey = iterator.next();
				//iterator.remove();
				handleKey(selectionKey);
			}*/
			selectionKeys.clear();
		} catch (IOException e) {
			//e.printStackTrace();
		}
	   }
   }
   
   public void handleKey(SelectionKey selectionKey)throws IOException{
	   System.out.println("=========handle=========");
		// 接受请求
		ServerSocketChannel server = null;
		SocketChannel client = null;
		String receiveText;
		String sendText;
		int count=0;
		// 测试此键的通道是否已准备好接受新的套接字连接。
		/*if (selectionKey.isAcceptable()) {
			// 返回为之创建此键的通道。
			server = (ServerSocketChannel) selectionKey.channel();
			// 接受到此通道套接字的连接。
			// 此方法返回的套接字通道(如果有)将处于阻塞模式。
			client = server.accept();
			// 配置为非阻塞
			client.configureBlocking(false);
			// 注册到selector,等待连接
			client.register(selector, SelectionKey.OP_READ);
		} else */
			
			if (selectionKey.isReadable()) {
			// 返回为之创建此键的通道。
			client = (SocketChannel) selectionKey.channel();
			//将缓冲区清空以备下次读取
			receivebuffer.clear();
			//读取服务器发送来的数据到缓冲区中
			count = client.read(receivebuffer);	
			if (count > 0) {
				receiveText = new String( receivebuffer.array(),0,count);
				System.out.println("服务器端接受客户端数据--:"+receiveText.trim());
				Client.list.add(selectionKey);
				//将缓冲区清空以备下次写入
				sendbuffer.clear();
				// 返回为之创建此键的通道。
				client = (SocketChannel) selectionKey.channel();
				String res="abc";
				sendbuffer.allocate(res.length());
				//向缓冲区中输入数据
				sendbuffer.put(res.getBytes());
				 //将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中                                读取数据发向服务器,就要复位
				sendbuffer.flip();
				//输出到通道
				client.write(sendbuffer);
				System.out.println("服务器端向客户端发送数据--:"+res);
				//client.register(selector, SelectionKey.OP_WRITE);
			}
		} else if (selectionKey.isWritable()) {
			System.out.println("==========writable=====");
			//将缓冲区清空以备下次写入
			sendbuffer.clear();
			// 返回为之创建此键的通道。
			client = (SocketChannel) selectionKey.channel();
			String res="abc";
			sendbuffer.allocate(res.length());
			//向缓冲区中输入数据
			sendbuffer.put(res.getBytes());
			 //将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位
			sendbuffer.flip();
			//输出到通道
			client.write(sendbuffer);
			System.out.println("服务器端向客户端发送数据--:"+res);
			//client.register(selector, SelectionKey.OP_READ);
		}
   }
}
 
分享到:
评论

相关推荐

    基于netty编写的socket服务端

    综上所述,基于Netty编写的socket服务端利用了Java的NIO特性,通过事件驱动和处理器链的方式,实现了高效的网络通信。开发者可以根据需求定制自己的业务处理器,处理各种复杂的网络协议,实现高性能的网络服务。在...

    Java NIO Socket基本

    **Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    通过NIOSocket工具,开发者能模拟大量并发连接,测试服务器在高负载下的表现。 该工具提供了服务端和客户端连接测试功能,包括单条发送、循环发送以及模拟多客户端发送,这些功能覆盖了网络通信的多种场景。单条...

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

    Socket服务端和客户端文件批量传输源码

    Socket服务端和客户端文件批量传输源码是一种基于TCP/IP协议的网络编程技术,它允许两台计算机通过网络进行数据交换,实现文件的批量传输。在Java等编程语言中,Socket通常被用来创建自定义的通信协议,是进行网络...

    nio的socket

    在NIO中,Socket通信不再局限于传统的`java.net.Socket`和`java.net.ServerSocket`,而是通过`java.nio.channels.SocketChannel`和`java.nio.channels.ServerSocketChannel`进行。 1. **SocketChannel**:这是NIO中...

    nio socket编程java代码示例,客户端发送消息,服务端接收

    本示例将详细解析如何使用Java的非阻塞I/O(NIO)实现Socket通信,包括客户端发送消息和服务器端接收消息的过程。 首先,理解NIO(Non-blocking Input/Output)的概念至关重要。NIO与传统的IO模型不同,它提供了对...

    socket服务端客户端

    在本主题中,我们将深入探讨"socket服务端客户端"的相关知识点,特别是在高效率通信和网络游戏开发中的应用。 首先,Socket是网络通信的一种接口,它允许两个或多个运行在网络上的程序通过网络进行数据交换。在TCP/...

    nio socket 消息推送

    总的来说,`NIO`在`Socket`消息推送中的应用能够显著提高服务端的并发处理能力,尤其适用于大规模的实时消息推送场景。结合`SpringBoot`的便捷性,可以快速构建出高效、稳定的消息推送服务。然而,`NIO`的学习曲线较...

    spring boot 整合的netty 实现的socket的服务端和客户端

    以下将详细讲解如何实现Spring Boot整合Netty的Socket服务端和客户端。 首先,我们来看服务端的实现。在`netty_server`项目中,我们需要创建一个`ServerBootstrap`实例,它是Netty服务器的核心。通过`...

    Java_Socket开发高并发小型服务器

    Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    NIO 服务器客户端例子

    Java NIO(New IO)是Java 5及更高版本中引入的一个重要特性,它提供了与标准的Java IO API不同的I/O工作方式。NIO代表非阻塞I/O,它的核心特点是能够实现多路复用,使得一个单线程可以同时处理多个连接,极大地提高...

    java socketNIO 实现多客户端聊天室 代码

    利用socketNIO实现的多客户端聊天室,非阻塞式IO,java代码编写,使用方法:先启动服务端代码再启动客户端代码,可启动多个客户端代码。若使用多个电脑启动客户端,需在客户端代码中更改一下ip地址。

    原创nio socket mina+javascript+flash实现commet长连接网页聊天室

    【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...

    采用NIO实现一个Socket服务器

    本篇将基于给定的标题“采用NIO实现一个Socket服务器”来详细阐述如何使用NIO进行Socket服务端的开发。 首先,理解NIO的核心概念: 1. **通道(Channel)**:通道是连接到I/O设备的途径,可以读取或写入数据。常见的...

    JAVA NIO 异步通信模板服务端

    总之,JAVA NIO异步通信模板服务端是利用Java NIO库实现的高效并发服务,通过非阻塞I/O和选择器机制,可以轻松处理大量并发连接,同时保持较低的资源消耗。在实际开发中,这样的模板可以作为基础,根据具体需求进行...

    基于java NIO的socket通信demo

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

    java socket 客户端和服务端例子

    在这个"java socket 客户端和服务端例子"中,我们有两个主要组件:服务端(server)和客户端(client),以及可能的服务类(service)用于处理特定的业务逻辑。 首先,让我们详细了解一下Java Socket的工作原理。在...

    联通SGIP1.2短信网关 发送接收短信皆可 可以应对高并发

    - 下行短信(发送短信给手机用户),里面有两种方式发送短信,一种是Socket,一种是NIO,NIO的性能较高 - 上行短信(接收手机用户的短信),实际是接收联通短信中心SMG发过来的信息,为了应对高并发的场景,使用了生产者和消费...

Global site tag (gtag.js) - Google Analytics