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

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
分享到:
评论

相关推荐

    socket 套接字 Java 套接字 编程

    Java套接字编程是网络通信的核心技术之一,主要用于实现客户端与服务器之间的数据交换。本文将深入探讨Java中的Socket编程,包括基本概念、工作原理、创建和使用Socket的过程,以及常见问题和解决策略。 1. 基本...

    java套接字编程笔记

    Java套接字编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在Java中,套接字(Socket)是实现客户端-服务器模型通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。这篇笔记将...

    Java非阻塞套接字概述

    非阻塞套接字编程的关键在于合理地使用Buffer和Selector。例如,当一个SocketChannel连接建立后,可以注册到Selector,监听读事件。当Selector通知有数据可读时,通过SocketChannel的`read`方法将数据读入Buffer,...

    Java NIO英文高清原版

    通道是一种连接到I/O设备(如文件、套接字或网络接口)的途径,可以实现数据的读取和写入。与BIO中的流不同,通道是双向的,既可以读也可以写。 2. **缓冲区(Buffer)**:在NIO中,数据被存储在缓冲区对象中。缓冲...

    一个经典的java 套接字传输范例

    在进行套接字编程时,必须处理各种可能的异常,如`IOException`、`UnknownHostException`和`ConnectException`等。确保在网络通信出错时能优雅地关闭资源并给出错误信息。 7. **关闭套接字** 通信完成后,应关闭...

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

    聊天室代码 套接字 java

    通过实践这个简单的Java聊天室项目,初学者不仅可以掌握套接字编程的基本技巧,还能深入了解网络通信和多线程编程。这个项目对于进一步学习分布式系统、微服务架构等高级话题也有很好的铺垫作用。在实践中遇到问题时...

    socket 套接字 编程介绍

    本篇将深入探讨Socket套接字编程的基础概念、工作原理以及如何在Java中实现。 1. 套接字基础: 套接字(Socket)是操作系统提供的接口,用于进程间的网络通信。它是连接网络应用和传输层协议(如TCP或UDP)的桥梁...

    JAVA NIO学习网站

    Java NIO提供了多种通道实现,如FileChannel、SocketChannel、ServerSocketChannel等,分别对应于文件、套接字和服务器套接字。 2. **缓冲区(Buffer)**:缓冲区是数据的容器,用于存储数据。与流不同,缓冲区有...

    基于java NIO的socket通信demo

    服务器的核心组件是`Selector`,它允许一个单独的线程监听多个套接字通道的状态变化。当客户端发起连接请求时,服务器会注册`ServerSocketChannel`到`Selector`上,等待连接的到来。一旦有连接请求,服务器将创建一...

    java 套接字

    了解并熟练掌握Java套接字编程,对于开发网络应用程序至关重要。无论是简单的文件传输、聊天应用,还是复杂的分布式系统,都离不开套接字这一基石。通过不断的实践和学习,开发者可以构建出高效、稳定的网络服务。

    java nio入门学习,两个pdf

    Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...

    java nio 读文件

    2. 通道(Channel):通道是数据源或目标的抽象,如文件、套接字等。可以从Channel读取数据到Buffer,也可以将Buffer的数据写入到Channel。 3. 非阻塞I/O:与传统的阻塞I/O不同,非阻塞I/O允许线程在等待数据就绪时...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    5. **套接字通道的改进**:如支持IPv6,以及SSL/TLS加密的套接字通道。 综上所述,Java NIO 和 NIO.2 提供了强大的工具和机制,使得开发者能够构建高并发、低延迟的系统。通过学习这两部分的内容,开发者可以更好地...

    Java语言基础教程-Java NIO流篇2

    通道是连接到I/O设备(如文件、网络套接字等)的桥梁,它可以读取或写入数据。通道是双向的,可以同时进行读写操作。Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于...

Global site tag (gtag.js) - Google Analytics