`
gaojingsong
  • 浏览: 1211516 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【JAVA之NIO编程Server端】

阅读更多

package demo.test;

 

import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

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;



 

public class NIOServer {

 

            /*标识数字*/

           private  int flag = 0;

            /*缓冲区大小*/

           private  int BLOCK = 4096;

           /*接受数据缓冲区*/

          private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);

           /*发送数据缓冲区*/

          private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);

          private  Selector selector;

 

         public NIOServer(int port) throws IOException {

             // 打开服务器套接字通道

             ServerSocketChannel 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 Start----8888:");

       }

 

 

         // 监听

        private void listen() throws IOException {

            while (true) {

               // 选择一组键,并且相应的通道已经打开

               selector.select();

              // 返回此选择器的已选择键集。

               Set<SelectionKey> selectionKeys = selector.selectedKeys();

               Iterator<SelectionKey> iterator = selectionKeys.iterator();

               while (iterator.hasNext()) {

                        SelectionKey selectionKey = iterator.next();

                        iterator.remove();

                        handleKey(selectionKey);

                }

            }

     }

 

          // 处理请求

         private void handleKey(SelectionKey selectionKey) throws IOException {

                 // 接受请求

                 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);

                   client.register(selector, SelectionKey.OP_WRITE);

            }

        } else if (selectionKey.isWritable()) {

                 //将缓冲区清空以备下次写入

                  sendbuffer.clear();

                 // 返回为之创建此键的通道。

                 client = (SocketChannel) selectionKey.channel();

                 sendText="message from server--" + flag++;

                 //向缓冲区中输入数据

                 sendbuffer.put(sendText.getBytes());

                //将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位

               sendbuffer.flip();

              //输出到通道

              client.write(sendbuffer);

              System.out.println("服务器端向客户端发送数据--:"+sendText);

              client.register(selector, SelectionKey.OP_READ);

        }

   }

 

       /**

          * @param args

           * @throws IOException

          */

        public static void main(String[] args) throws IOException {

                     int port = 8888;

                     NIOServer server = new NIOServer(port);

                   server.listen();

             }

           }

  • 大小: 48.2 KB
0
1
分享到:
评论

相关推荐

    JAVA-NIO程序设计完整实例

    - **高并发服务器**: NIO的选择器机制使得一个线程可以处理多个客户端连接,适合构建高性能的服务器端应用。 - **文件批量处理**: 使用FileChannel的transferTo()和transferFrom()方法,可以高效地进行文件的复制和...

    nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser

    标题中的“nioserver.zip_NIO_event driven java_java nio_java nioserv_nioser”表明这是一个关于Java NIO的服务器实现,且是基于事件驱动模式的。事件驱动编程是一种设计模式,它允许程序对特定事件做出响应,而...

    NioSocket,包括server端和client端

    NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...

    基于java NIO的socket通信demo

    首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端实现。服务器的核心组件是`Selector`,它允许一个单独的线程监听多个套接字通道的状态变化。当客户端发起连接请求时,服务器会注册`...

    NIOServer

    【标题】:“NIOServer”是一个关于网络编程的Java实现,它使用了Java的非阻塞I/O(Non-blocking I/O,NIO)技术。在Java中,NIO是一种替代传统阻塞I/O(BIO)模型的方式,提供了更高效的数据传输能力。此项目可能是...

    nioserver.rar_NIO_java nio

    NIO(Non-blocking Input/Output)是Java编程语言中的一种I/O模型,它与传统的阻塞I/O(BIO)模型相比,具有更高的性能和更灵活的架构。NIO在Java 1.4版本中引入,全称为New Input/Output,它的核心在于“非阻塞”二...

    实现java网络与nio例子

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 ...这个"网络与nio"的压缩包文件很可能包含了服务器端和客户端的完整代码示例,可以帮助我们深入理解并实践Java NIO在网络编程中的应用。

    浅谈java中nio的使用方式

    Java NIO(New Input/Output)是一种用于处理I/O操作的非阻塞I/O模型,与传统的Java IO相比,它提供了更高的性能和更灵活的编程方式。NIO的核心概念包括Channel、Selector、SelectionKey和Buffer。 1. **Channel...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    Java NIO(Non-blocking Input/...在实际开发中,Java NIO的使用需要对多线程、网络编程以及NIO API有深入的理解。通过这种方式构建的系统可以高效地处理大量并发连接,非常适合于聊天、游戏等实时性要求高的应用场景。

    java nio聊天室源码

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞I/O操作的能力,极大地提升了Java在...通过分析和学习这个源码,开发者可以深入理解Java NIO的工作原理,并将其应用于实际的网络编程项目中。

    java BIO NIO AIO

    BIO 的工作机制是基于 Client/Server 模型的,服务器端负责绑定 IP 地址,启动监听端口;客户端负责发起连接操作。连接成功后,双方通过网络套接字(Socket)进行通信。在 BIO 模式下,客户端和服务端是完全同步的,...

    Java NIO原理解析

    Java NIO,即Non-Blocking I/O,是Java在JDK 1.4引入的一套新的I/O API,旨在提供一种更加高效的方式来处理I/O操作,尤其是对于网络编程和高并发场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器...

    Java_qq_Server.rar_Java_qq_Server_Socket网络编程_java 网络编程_即时通信_网络通信

    2. **服务器端(Server)**:在Java QQ Server中,服务器端使用ServerSocket创建一个监听对象,设置监听的端口号,然后调用accept()方法等待客户端的连接请求。当有客户端连接时,accept()方法会返回一个新的Socket...

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

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

    java NIO 学习 聊天室程序 (3)

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,是对传统IO模型的重大改进。在传统的IO模型中,数据传输基于字节流...同时,通过分析源代码,你将能更好地掌握NIO在实际项目中的应用,提升你的Java并发编程技能。

    java NIO 开发技术

    总的来说,Java NIO通过非阻塞I/O和选择器机制,实现了更加高效和可扩展的网络编程模型,特别适合处理大量并发连接的情况,如Web服务器、分布式系统等。理解和掌握NIO的原理和使用,对于优化高性能服务器端程序具有...

    Java socket网络编程的基础示例

    Java Socket网络编程是Java平台中实现网络通信的核心技术,它基于传输层协议TCP和UDP,为应用程序提供了低级别的、原始的比特流服务。本基础示例将深入探讨这两种协议下的Socket编程。 首先,TCP(Transmission ...

    java FTP server

    开发者可以利用Java的`java.net.Socket`类来创建网络连接,`java.nio`包中的类处理文件读写,以及通过多线程处理并发的FTP客户端请求。FTP服务器的主要功能包括: 1. **用户认证**:Java FTP Server需要具备用户...

    使用Java_NIO编写高性能的服务器.doc

    ### 使用Java NIO编写高性能服务器的关键...综上所述,使用Java NIO编写的高性能服务器通过引入非阻塞IO机制,不仅极大地提升了系统的并发处理能力,还有效降低了资源消耗,是现代高性能服务器开发不可或缺的技术之一。

    Java-network-programming-server.zip_java programming_java server

    本资料包"Java-network-programming-server.zip"聚焦于Java在服务器端的网络编程实践。 首先,我们要了解Java中的网络编程基础。Java通过内置的`java.net`和`java.nio`包提供了网络通信的能力。`java.net`包包含了...

Global site tag (gtag.js) - Google Analytics