`
dengminhui
  • 浏览: 167900 次
  • 来自: ...
社区版块
存档分类
最新评论

NIO代码实例分享

阅读更多

 

(1)server主要是读取client发过来的信息,并返回一条信息

 

 

/**
 * @author Jeff
 */
public class HelloWorldServer {

    static int               BLOCK        = 1024;
    static String            name         = "";
    protected Selector       selector;
    protected ByteBuffer     clientBuffer = ByteBuffer.allocate(BLOCK);
    protected CharsetDecoder decoder;
    static CharsetEncoder    encoder      = Charset.forName("GB2312").newEncoder();

    public HelloWorldServer(int port) throws IOException{
        selector = this.getSelector(port);
        Charset charset = Charset.forName("GB2312");
        decoder = charset.newDecoder();
    }

    // 获取Selector
    protected Selector getSelector(int port) throws IOException {
        ServerSocketChannel server = ServerSocketChannel.open();
        Selector sel = Selector.open();
        server.socket().bind(new InetSocketAddress(port));
        server.configureBlocking(false);
        server.register(sel, SelectionKey.OP_ACCEPT);
        return sel;
    }

    // 监听端口
    public void listen() {
        try {
            for (;;) {
                selector.select();
                Iterator iter = selector.selectedKeys().iterator();
                while (iter.hasNext()) {
                    SelectionKey key = (SelectionKey) iter.next();
                    iter.remove();
                    process(key);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 处理事件
    protected void process(SelectionKey key) throws IOException {
        if (key.isAcceptable()) { // 接收请求
            ServerSocketChannel server = (ServerSocketChannel) key.channel();
            SocketChannel channel = server.accept();
            // 设置非阻塞模式
            channel.configureBlocking(false);
            channel.register(selector, SelectionKey.OP_READ);
        } else if (key.isReadable()) { // 读信息
            SocketChannel channel = (SocketChannel) key.channel();
            int count = channel.read(clientBuffer);
            if (count > 0) {
                clientBuffer.flip();
                CharBuffer charBuffer = decoder.decode(clientBuffer);
                name = charBuffer.toString();
                // System.out.println(name);
                SelectionKey sKey = channel.register(selector, SelectionKey.OP_WRITE);
                sKey.attach(name);
            } else {
                channel.close();
            }

            clientBuffer.clear();
        } else if (key.isWritable()) { // 写事件
            SocketChannel channel = (SocketChannel) key.channel();
            String name = (String) key.attachment();

            ByteBuffer block = encoder.encode(CharBuffer.wrap("Hello !" + name));

            channel.write(block);

            // channel.close();

        }
    }

    public static void main(String[] args) {
        int port = 8888;
        try {
            HelloWorldServer server = new HelloWorldServer(port);
            System.out.println("listening on " + port);

            server.listen();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

 

(2)client端代码

 

 

 /** 
  *  
  * @author Jeff 
  * 
  */  
 public class HelloWorldClient {  
   
     static int SIZE = 10;  
     static InetSocketAddress ip = new InetSocketAddress("localhost", 8888);  
     static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();  
   
     static class Message implements Runnable {  
         protected String name;  
         String msg = "";  
   
         public Message(String index) {  
             this.name = index;  
         }  
   
         public void run() {  
             try {  
                 long start = System.currentTimeMillis();  
                 //打开Socket通道  
                 SocketChannel client = SocketChannel.open();  
                 //设置为非阻塞模式  
                 client.configureBlocking(false);  
                 //打开选择器  
                 Selector selector = Selector.open();  
                 //注册连接服务端socket动作  
                 client.register(selector, SelectionKey.OP_CONNECT);  
                 //连接  
                 client.connect(ip);  
                 //分配内存  
                 ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);  
                 int total = 0;  
   
                 _FOR: for (;;) {  
                     selector.select();  
                     Iterator iter = selector.selectedKeys().iterator();  
   
                     while (iter.hasNext()) {  
                         SelectionKey key = (SelectionKey) iter.next();  
                         iter.remove();  
                         if (key.isConnectable()) {  
                             SocketChannel channel = (SocketChannel) key  
                                     .channel();  
                             if (channel.isConnectionPending())  
                                 channel.finishConnect();  
                             channel  
                                     .write(encoder  
                                             .encode(CharBuffer.wrap(name)));  
   
                             channel.register(selector, SelectionKey.OP_READ);  
                         } else if (key.isReadable()) {  
                             SocketChannel channel = (SocketChannel) key  
                                     .channel();  
                             int count = channel.read(buffer);  
                             if (count > 0) {  
                                 total += count;  
                                 buffer.flip();  
   
                                 while (buffer.remaining() > 0) {  
                                     byte b = buffer.get();  
                                     msg += (char) b;  
                                       
                                 }  
   
                                 buffer.clear();  
                             } else {  
                                 client.close();  
                                 break _FOR;  
                             }  
                         }  
                     }  
                 }  
                 double last = (System.currentTimeMillis() - start) * 1.0 / 1000;  
                 System.out.println(msg + "used time :" + last + "s.");  
                 msg = "";  
             } catch (IOException e) {  
                 e.printStackTrace();  
             }  
         }  
     }  
   
     public static void main(String[] args) throws IOException {  
       
         String names[] = new String[SIZE];  
   
         for (int index = 0; index < SIZE; index++) {  
             names[index] = "jeff[" + index + "]";  
             new Thread(new Message(names[index])).start();  
         }  
       
     }  
 } 
 

 

转载地址:http://ecjtu05.blog.sohu.com/119571227.html

 

 

 

分享到:
评论

相关推荐

    NIO实例

    标题中的"NIO实例"指的是Java中的非阻塞I/O(Non-blocking Input/Output)技术,它是Java从1.4版本开始引入的一种I/O...通过阅读相关博文和研究代码实例,我们可以深入理解并掌握NIO技术,提高我们的Java网络编程能力。

    NIO学习-Java源代码分享(含netty)

    在"**NIO学习-Java源代码分享**"这个压缩包中,可能包含了关于NIO的示例代码,包括使用NIO进行文件操作、网络通信的实例,也可能包含Netty或Mina的部分源码,这些都可以作为学习和研究NIO技术的宝贵资源。...

    Java NIO实例UDP发送接收数据代码分享

    "Java NIO实例UDP发送接收数据代码分享" Java NIO(Non-blocking I/O)是一种异步I/O模型,允许开发者在单个线程中处理多个I/O操作,从而提高程序的性能和可扩展性。在Java NIO中,DatagramChannel是专门用于发送...

    java的nio的使用示例分享

    在上述代码示例中,`Watcher`类展示了如何创建一个`WatchService`并监听指定目录的事件。当文件系统发生变化时,程序会接收到相应的`WatchEvent`,从而避免了低效的轮询操作。 2. **选择器(Selectors)和多路复用...

    java的NIO管道用法代码分享

    Java的非阻塞I/O(Non-blocking Input/Output, NIO)是Java 1.4引入的一个重要特性,它提供了一种不同于传统阻塞I/O的处理方式,尤其是在高并发和大数据传输场景下表现优越。NIO管道(Pipe)是NIO中用于线程间通信的...

    基于Java的实例源码-NIO网络框架 xSocket.zip

    - **社区支持**:加入相关的开发者社区,获取帮助、分享经验,共同进步。 通过以上内容,我们可以了解到Java NIO网络框架xSocket的核心概念、特点和应用场景。对于Java程序员来说,掌握NIO技术和使用xSocket框架...

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

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

    IO、文件、NIO 最佳阅读资料与实践

    压缩文件“IO、文件、NIO【草案二】.docx”很可能包含了作者对这些主题的详细分析和示例代码,可能包括最佳实践、常见问题和解决方案,以及可能的性能优化技巧。读者可以通过阅读这份文档深入学习IO、文件操作和NIO...

    网络与nio

    6. **实例分析**:通过SumServer.java、SumServer2.java、SumServer3.java这三份代码,可能分别演示了简单的NIO服务器、改进版和更复杂的实现,对比分析它们的区别和性能优化。 7. **同步与异步**:讨论NIO的异步...

    Apache MINA使用案例源代码

    Apache MINA(Multipurpose ...当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。供大家一起共同分享学习。

    Socket通信实例源代码

    在这个实例中,我们将深入探讨Socket服务器和客户端的通信代码实现,以及在编写此类代码时的一些关键技巧。 首先,让我们从Socket的基本概念开始。Socket在操作系统层面是网络通信的一个接口,它允许两个程序通过...

    微信分享后端接口

    在本案例中,如果选择将分享点击量写入文件,可以使用Java的IO或NIO库。例如,使用`FileWriter`或`BufferedWriter`进行写操作,确保数据的正确写入和同步。而如果使用NIO,可以利用通道(Channel)和缓冲区(Buffer...

    java编程进行动态编译加载代码分享

    Java动态编译加载代码分享知识点 Java动态编译加载代码分享是Java编程中的一种重要技术,能够动态编译加载Java代码,实现灵活的代码管理和执行。下面是相关的知识点: 1. JavaCompiler类:JavaCompiler类是Java...

    Java项目开发实用案例_第2章代码

    在本Java项目开发实用案例中,我们关注的重点是"第2章代码",这章主要涉及的是一个"电子相册系统"的实现。这个系统旨在提供一个用户友好的平台,用于存储、管理和分享个人照片。通过这个项目,我们可以深入学习Java...

    Java案例开发 是一本很不错的程序书~学习项目可以用这本书参看一下

    10. **设计模式**:作为软件工程的精华,设计模式在提高代码可读性和可维护性方面至关重要,书中可能讲解了一些常见的设计模式,并通过案例进行演示。 《www.pudn.com.txt》这个文件可能是从Pudn网站下载的资源,...

    基于Java的实例源码-仿千千静听音乐播放器源代码.zip

    该压缩包文件“基于Java的实例源码-仿千千静听音乐播放器源代码.zip”包含了一个使用Java编程语言实现的音乐播放器项目,它模仿了著名的千千静听音乐播放器的功能和界面。这个项目对于学习Java GUI设计、音频处理...

    Java P2P技术内幕代码

    Java P2P(对等网络)技术是一种分布式通信模型,其中每个节点既是客户端也是服务器,可以互相分享资源和服务。在Java中实现P2P技术,需要深入理解网络编程、多线程、数据传输以及文件共享等相关知识。本资料集包含...

    java经典项目源码百度云.zip

    12. **IO与NIO**:Java的IO流和非阻塞I/O(New IO)在处理文件和网络通信时不可或缺。 13. **JSON处理**:Gson或Jackson库可能被用来序列化和反序列化JSON数据。 14. **日志系统**:如Log4j或SLF4J,用于记录应用...

Global site tag (gtag.js) - Google Analytics