`
qq466862016
  • 浏览: 125832 次
  • 来自: 杭州
社区版块
存档分类
最新评论

java NIO套接字编程

    博客分类:
  • java
阅读更多

java NIO套接字编程

      在java的套接字编程中,大部分一般使用阻塞IO套接字编程。套接字的读取和写入会阻塞(也就是说不管现在有没有写入/读出数据 调用read和write方法将会阻塞)。而NIO将I/O事件注册,当特定的注册I/O事件到达时会通知您。不需要轮询,也不需要创建大量的线程下面一个例子:

package simple.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by banxia on 16/10/12.
 */
public class UseNioSocket {


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

        // 创建一个selector 对象
        Selector selector = Selector.open();

        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        ssc.socket().bind(new InetSocketAddress(8888));
        ssc.register(selector, SelectionKey.OP_ACCEPT);
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        System.out.println("服务已经启动端口:" + 8888);

        while (true) {

            int selectNum = selector.select();
            System.out.println("selectNum=" + selectNum);

            if (selectNum <= 0) {
                continue;
            }
            // 获取

            Iterator<SelectionKey> it = selector.selectedKeys().iterator();

            while (it.hasNext()) {

                SelectionKey key = it.next();

                if (key.readyOps() == SelectionKey.OP_ACCEPT) {
                    // 接收 accept

                    ServerSocketChannel channel = (ServerSocketChannel) key.channel();
                    SocketChannel accept = channel.accept();
                    accept.configureBlocking(false);
                    System.out.println("接收客户端:" + accept.socket().getInetAddress().getHostAddress() + ":" +  accept.socket().getPort());
                    accept.register(selector, SelectionKey.OP_READ);
                    it.remove();


                } else {

                    SocketChannel sc = (SocketChannel) key.channel();
                    System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"开始处理...");
                    while (true) {
                        buffer.clear();
                        long l = sc.read(buffer);
                        if (l <= 0) {
                            break;
                        }
                        System.out.print(".");
                        buffer.flip();
                        sc.write(buffer);


                    }
                    System.out.print("\n");
                    it.remove();
                    System.out.println("接收客户端:" + sc.socket().getInetAddress().getHostAddress() + ":" + sc.socket().getPort() +"处理完成处理...");

                }

            }


        }


    }
}

 

1
0
分享到:
评论

相关推荐

    Java非阻塞套接字概述

    新的Java1.4 I/O体系朝着快速,灵活和可升级的Java应用程序的方向迈进了重要的一大步。看完这篇文章,依靠非阻塞套接字技术你可以写一个基于非阻塞套接字的应用程序而不用手工来处理多线程。

    nio-ssh:SSH协议的纯Java实现,它使用NIO网络套接字和通道

    使用NIO进行套接字编程意味着可以使用最少数量的线程来支持多个SSH会话。 通过拥有清晰简洁的文档(包括有关所有方法的JavaDoc,甚至包括私有方法),我们希望使该库易于理解和实现。 通过具有极高的单元测试覆盖

    Naga-Socket:Naga-Socket - Java 简单套接字

    简化的 Java NIO 异步套接字 这个库不是我创建的:自动从 code.google.com/p/naga 导出 Naga 不是一个框架。 Naga 的目标是成为一个非常小的 NIO 库,它提供了一些 java 类来用异步 NIO 对应物(类似于为 Java 1.7 ...

    socketjava源码-demo-sockets-io-nio-nio2:“Java套接字I/O:阻塞,非阻塞和异步”文章和源代码

    Winsock也是基于Berkeley套接字的,具有符合Windows编程模型的附加功能。 POSIX定义 本文使用了POSIX规范中的简化定义。 阻塞的线程-在可以继续执行之前正在等待某种条件的线程。 阻塞-套接字的属性,使套接字对其...

    Java CP/IP Socket编程

    1.5 什么是套接字..........9 1.6 练习..........10 第2章基本套接字..........10 2.1 套接字地址..........10 2.2 TCP套接字..........17 2.2.1 TCP客户端..........17 2.2.2 TCP服务器端..........22 2.2.3...

    JAVA_API1.6文档(中文)

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    基础深化和提高-网络编程

    Socket编程:基于Socket套接字,通过TCP或UDP协议进行网络通信。通过创建Socket对象,程序可以在网络上进行数据传输和通信。 URL和URLConnection:Java提供了java.net.URL和java.net.URLConnection等类,用于访问...

    jvm、nio、netty优化使用.txt

    它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序将遭受可维护性或性能问题的困扰。Netty经过精心设计,结合了许多协议(例如FTP,SMTP,HTTP以及各种基于二进制和...

    协议socket通讯JAVA Spring Boot对接.rar

    网络编程也称作为 Socket 编程,套接字编程。 Socket 通信是 Client/Server 模型 而网络通信的本质是网络间的数据 IO,这又牵扯出了 BIO 和 NIO这两个通讯模型: 2. IO通讯模型 只要有 IO,就会有阻塞或非阻塞的...

    java api最新7.0

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    Java 1.6 API 中文 New

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    JavaAPI1.6中文chm文档 part1

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    java jdk-api-1.6 中文 chmd

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JavaAPI中文chm文档 part2

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    1_6_zh_CN.CHM

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

Global site tag (gtag.js) - Google Analytics