`
lenj
  • 浏览: 37426 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

NIO连接socket

阅读更多
NIO连接socket
早就听说JAVA的NIO比IO牛一些,可是牛在哪里一直都不知道,并且NIO比IO难学,搞了半天终于用NIO弄了两个程序,一个是服务器端,一个是客户端,都是用NIO连接的,代码如下,注释比较少,输出比较多:)

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package testnio;

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.Set;

/**
*
* @author hadeslee
*/
public class Receive {

    public static void main(String[] args) throws Exception {
        boolean b = true;
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ServerSocketChannel ss = ServerSocketChannel.open();
        ss.socket().bind(new InetSocketAddress(8888));
        ss.configureBlocking(false);
        Selector se = Selector.open();
        ss.register(se, SelectionKey.OP_ACCEPT);
        while (se.select() > 0) {
            Set<SelectionKey> set = se.selectedKeys();
            System.out.println("进入一个循环,大小是:" + set.size());
            for (SelectionKey key : set) {
                int ops = key.readyOps();
                System.out.println("ops=" + ops);
                if ((ops & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                    SocketChannel sc = ss.accept();
                    System.err.println("有新的连接了" + sc);
                    System.err.println("地址是:" + sc.socket());
                    sc.configureBlocking(false);
                    sc.register(se, SelectionKey.OP_READ);
                }
                if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                    System.err.println("有新的读取");
                    SocketChannel sc = (SocketChannel) key.channel();
                    System.out.println(sc.isConnected());
                    sc.read(buffer);
                    buffer.flip();
                    //System.out.println(new String(buffer.array()));
                    Thread.sleep(5000);
                    if (b) {
                        b = false;
                        sc.write(buffer);
                    }

                }
            }
            set.clear();
            System.out.println("退出循环");
        }

    }
}

客户端:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package testnio;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Set;

/**
*
* @author hadeslee
*/
public class Send {

    public static void main(String[] args) throws Exception {
        SocketChannel sc = SocketChannel.open();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        Selector se = Selector.open();
        buffer.put("我是中国人,我爱我的祖国,hadeslee".getBytes());
        buffer.flip();
       
        sc.configureBlocking(false);
        sc.register(se, SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE);
        sc.connect(new InetSocketAddress("192.168.1.58", 8888));
        while(!sc.finishConnect());
        sc.write(buffer);
        System.out.println("进入循环");
        Thread.sleep(10000);
        int sum = se.select();
        while (se.select() > 0) {
            Thread.sleep(100);
              
                System.out.println("终于大于0了");
                Set<SelectionKey> set = se.selectedKeys();
                System.out.println("大小是:"+set.size());
                for (SelectionKey key : set) {
                    int ops = key.readyOps();
                    if ((ops & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT) {
                        sc.write(buffer);
                        System.out.println("连接成功");
                    }
                    if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                        System.out.println(" 收到东西");
                        sc.read(buffer);
                        buffer.flip();
                        System.out.println("收到的是:" + new String(buffer.array(),0,buffer.limit()));
                        sc.write(buffer);
                    }
                }
               se.selectedKeys().clear();
        }
    }

    private static ByteBuffer[] get(String heads) {
        ByteBuffer[] bbs = new ByteBuffer[heads.length];
        for (int i = 0; i < bbs.length; i++) {
            String s = heads[i];
            bbs[i] = ByteBuffer.allocateDirect(1024);
            bbs[i].put(s.getBytes());
            bbs[i].flip();
        }
        return bbs;
    }
}
有机会再好好研究它们之间的更加具体的用法,以上的只是一个简单的,能互连的一个例子.
分享到:
评论

相关推荐

    《NIO与Socket编程技术指南》_高洪岩

    《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...

    java nio 实现socket

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

    nio的socket

    1. **SocketChannel**:这是NIO中的客户端连接通道,用于代替传统的`Socket`。`SocketChannel`可以从服务器接收数据,也可以向服务器发送数据。与`Socket`不同的是,`SocketChannel`是非阻塞的,这意味着当没有数据...

    Java NIO Socket基本

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

    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库中用于网络通信的关键组件,它们允许...

    NioSocket,包括server端和client端

    在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心特点是能够进行多路复用,即一个线程可以同时处理多个连接,这使得NioSocket在高并发场景下具有较好的性能表现。 服务器端...

    基于java NIO的socket通信demo

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了系统在处理大量并发连接时的效率。在这个“基于java NIO的socket通信demo...

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    java NIO socket聊天

    `Socket`在NIO中的实现是`SocketChannel`,它代表了网络上的一个连接。`ServerSocketChannel`则用于监听客户端的连接请求。通过`ServerSocketChannel`的`accept()`方法,服务器可以接收新的客户端连接,然后将其注册...

    java socket nio 研究

    总的来说,Java Socket结合NIO,能够构建出高性能的网络应用,尤其适用于需要处理大量并发连接的场景,如聊天服务器、流媒体服务等。`NonBlockingServer.java`和`Client.java`的代码分析和实践,可以帮助我们更好地...

    一般Socket客户端与Mina NIO Socket客户端对比示例

    2. 并发能力:Mina NIO的并发能力远超普通Socket,因为其可以有效利用线程资源,处理更多连接。 3. 开发复杂度:Mina NIO需要对Java NIO有深入理解,而普通Socket相对简单,学习曲线较平缓。 4. 扩展性:Mina提供了...

    网络与nio

    标题中的“网络与nio”指的是Java的非阻塞I/O(Non-blocking Input/Output),它是一种高效的I/O处理模型,特别是在处理大量并发连接时。在传统的阻塞I/O模式下,当一个线程进行读写操作时,如果数据未准备好,该...

    java基于nio的socket通信.rar

    创建一个简单的NIO Socket服务器,需要创建`ServerSocketChannel`,监听连接,然后对每个连接创建`SocketChannel`,将其注册到选择器上,处理读写事件。客户端则创建`SocketChannel`,连接服务器,然后进行数据传输...

    JAVANIO在Socket通讯中的应用

    ### JAVANIO在Socket通讯中的应用 #### 引言 在Java开发中,网络通信是常见需求之一,其中Socket编程是最基础也是最重要的技术之一。然而,在传统的Java Socket编程中,由于采用的是阻塞I/O模型,即所有的读写操作...

    Socket 之 BIO、NIO、Netty 简单实现

    在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...

    Nio非阻塞socket通信demo

    在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **Java NIO基础** - **通道(Channels)**:NIO的核心概念之一,通道是数据读写的目标或来源,如文件通道、套接字通道等。...

    socket通信NIO代理模式demo实例

    NIO(Non-blocking I/O)是Java提供的一个高效I/O模型,相较于传统的IO模型,NIO具有非阻塞、多路复用等特性,能够更好地处理大量并发连接。本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的...

    android-socket-nio-master.zip

    "android-socket-nio-master.zip" 是一个关于Android中使用Socket结合NIO实现高效通信的项目,其目标是提高Socket通信的性能和处理大量并发连接的能力。 NIO(非阻塞I/O)是Java提供的一个替代传统I/O的API,主要...

    采用NIO实现一个Socket服务器

    至此,我们已经创建了一个简单的NIO Socket服务器,能够接受客户端连接并进行数据传输。实际应用中,还需要考虑异常处理、多线程处理客户端、关闭资源等细节。通过阅读提供的“NIO_Sample”压缩包中的代码示例,可以...

Global site tag (gtag.js) - Google Analytics