基于Java NIO 的socket通信实例

基于NIO的Socket通信(使用Java NIO的综合示例讲解) 本篇文章并不是NIO和Socket的入门文章,如果你在看完后有些难度可以先学习基础知识后再进行阅读,但是本文的一些概念不论是入门还是学习已久的人都会有些许收获。(感觉基础不足的可以阅读前文两个链接来获取更多的细节) 一、NIO的简介 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,Java NIO提供了与标准IO不同的IO工作方式: IO NIO... 阅读详情

服务端代码

package com.lp.socket;

import java.io.IOException;
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.Iterator;

public class NioServerSocket {

    public static void main(String[] args) {

        HandlerSelectionKey handler = new HandlerHandlerSelectionKeyImpl();

        try {
            //创建 ServerSocketChannel
            ServerSocketChannel server = ServerSocketChannel.open();
            server.configureBlocking(false);
            server.bind(new InetSocketAddress("localhost", 12345));
            //创建 Selector
            Selector selector = Selector.open();
            server.register(selector, SelectionKey.OP_ACCEPT);
            //死循环,持续接收 客户端连接
            while(true) {
                //selector.select(); 是阻塞方法
                int keys = selector.select();
                if(keys > 0) {
                    Iterator<SelectionKey> it = selector.selectedKeys().iterator();
                    while(it.hasNext()) {
                        SelectionKey key = it.next();
                        it.remove();
                        //处理 SelectionKey
                        handler.handler(key, selector);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * SelectionKey 处理接口
     *
     */
    public static interface HandlerSelectionKey {

        public void handler(SelectionKey key, Selector selector) throws IOException;

    }

    /**
     * SelectionKey 接口 实现类
     *
     */
    public static class HandlerHandlerSelectionKeyImpl implements HandlerSelectionKey {

        @Override
        public void handler(SelectionKey key, Selector selector) throws IOException {
            int keyState = selectionKeyState(key);
            switch (keyState) {
            case SelectionKey.OP_ACCEPT:
                ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
                accept(serverSocketChannel, selector);
                break;
            case SelectionKey.OP_READ:
                SocketChannel readSocketChannel = (SocketChannel) key.channel();
                read(readSocketChannel, selector);
                break;

            case SelectionKey.OP_WRITE:
                SocketChannel writeSocketChannel = (SocketChannel) key.channel();
                write(writeSocketChannel, selector);
                break;
            }
        }
        /**
         * 获取 SelectionKey 是什么事件
         * @param key
         * @return
         */
        private int selectionKeyState(SelectionKey key) {
            if(key.isAcceptable()) {
                return SelectionKey.OP_ACCEPT;
            } else if(key.isReadable()) {
                return SelectionKey.OP_READ;
            } else if(key.isWritable()) {
                return SelectionKey.OP_WRITE;
            }
            return -1;
        }

        /**
         * 接口客户端请求
         * @param serverSocketChannel
         * @param selector
         * @throws IOException
         */
        private void accept(ServerSocketChannel serverSocketChannel, Selector selector) throws IOException {
            SocketChannel socketChannel = serverSocketChannel.accept();
            socketChannel.configureBlocking(false);
            //将 channel 注册到  Selector
            socketChannel.register(selector, SelectionKey.OP_READ);
        }

        /**
         * 读取客户端发送过来的信息
         * @param socketChannel
         * @param selector
         * @throws IOException
         */
        private void read(SocketChannel socketChannel, Selector selector) throws IOException {
            ByteBuffer readBuffer = ByteBuffer.allocate(8192);
            int readBytes = socketChannel.read(readBuffer);
            if(readBytes > 0) {
                System.out.println("客户端发送来的消息");
                System.out.println(new String(readBuffer.array(), 0, readBytes));
            }
            //将 channel 注册到  Selector
            socketChannel.register(selector, SelectionKey.OP_WRITE);
        }

        /**
         * 响应客户端请求
         * @param socketChannel
         * @param selector
         * @throws IOException
         */
        private void write(SocketChannel socketChannel, Selector selector) throws IOException {
            //响应消息
            String responseMsg = "hello client, i am server";
            byte[] responseByte = responseMsg.getBytes();
            ByteBuffer writeBuffer = ByteBuffer.allocate(responseByte.length);
            writeBuffer.put(responseByte);
            writeBuffer.flip();
            //响应客户端
            socketChannel.write(writeBuffer);
            socketChannel.finishConnect();
            socketChannel.close();
        }

    }


}

客户端代码

package com.lp.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NioClientSocket {

    public static void main(String[] args) throws IOException {
        //打开 SocketChannel
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 12345));
        //设置为 非阻塞
        socketChannel.configureBlocking(false);
        //给服务端发送信息
        socketChannel.write(ByteBuffer.wrap("Actions speak louder than words!".getBytes()));

        ByteBuffer readBuffer = ByteBuffer.allocate(512);
        while (true) {
            readBuffer.clear();
            int readBytes = socketChannel.read(readBuffer);
            if (readBytes > 0) {
                readBuffer.flip();
                System.out.println("Client: readBytes = " + readBytes);
                System.out.println("Client: data = " + new String(readBuffer.array(), 0, readBytes));
                socketChannel.close();
                break;
            }
        }

    }

}
Java NIO编写Socket服务器的一个例子 Java中编写Socket服务器,通常有一下几种模式: 1. 一个链接一个线程;优点:程序编写简单; 缺点:如果链接非常多,分批的线程会非常多,机器可能资源耗尽而崩溃。 2.把每一个新链接,交接给一个固定数量的连接池;优点:程序编写相对简单,可以处理大量的链接。确定:线程的开销非常大,链接很多的情况,排队现象会比较严重。 3. 使用Java中NIO,用异步IO方式处理。这种模式,可以用一个线 阅读详情

相关推荐

使用Java NIO实现异步的socket通信

最近在学习NIO与socket,发现了一组比较好的文章:http://blog.youkuaiyun.com/kongxx/article/details/7288896。这篇文章使用Selector来管理ServerSocketChannel,事实上不是没有做到真正的异步,还是按部就班地接受连接,收发信息,然后释放连接。更常规的方法是服务端使用两个线程,一个线程才用阻塞的方法来accept客户端,另一个线程

zhouxinyubest的专栏 4217

java nio socket简单示例

1、说明java nio底层基于Reactor模型,采用多路复用IO模型,由一个专门的线程来处理所有的 IO 事件,并负责分发。基于事件驱动机制能够在事件到的时触发,而不是同步的去监视事件。 线程之间的通讯是通过 wait、notify等方式通讯,保证每次上下文切换都是有意义的,减少无谓的线程切换。 服务端和客户端各自维护一个管理通道的对象selector,其能检测一个或多个通道 (channel)

皮斯特劳沃 1513

java NIO 实现非阻塞socket通信

java的nio为非阻塞式socket通信提供了如下几个类:           Selector : 它是SelectableChannel对象的多路复用器,所有希望采用非阻塞方式进行通信的channel都应该注册到Selector对象。可以通过调用此类的open()静态方法来创Selector实例,该方法将使用系统默认的Selector来返回新的Selector。  Selecto

hjh_walker的博客 2651

java nio socket 例子_java nio socket实例

public classNioClient {//管道管理器privateSelector selector;public NioClient init(String serverIp, intport) throws IOException{//获取socket通道SocketChannel channel =SocketChannel.open();channel.configureBlock...

weixin_28976179的博客 166

Java Socket实战之六 使用NIO包实现Socket通信

Java Socket实战之六 使用NIO包实现Socket通信

qq_44894516的博客 321

使用Java NIO 实现一个socket通信框架

使用Java NIO(非阻塞I/O)实现一个Socket通信框架,可以让你构建高性能的网络应用。NIO提供了Channel、Buffer和Selector等核心组件,支持非阻塞模式下的网络编程。下面是一个简单的例子,展示了如何使用Java NIO创建一个基本的服务器端和客户端进行Socket通信。

shangjg3的博客 337

java NIOSocket 通信简要举例

基于Java使用NIOSocket(java.nio.*)通信的举例: 首先创建NIOSocket的服务端;其次创建NIOSocket的客户端。 通信过程如下: 客户端(C)向服务端(S)发送任意数据(包括用户直接从控制台输入数据,使用Scanner),服务端接受到来自客户端的数据并展示,同时客户端发过来的数据原封不动的再发给客户端;客户端接受来自服务端的数据并展示。 说明:通信过程如上。

junehappylove(王俊伟)的专栏 1783

用数据分析优化彩票决策:放弃预测,专注理性投入

彩票本质上是负和博弈的概率系统,其核心并非号码预测,而是对玩法规则、返奖率(RTP)、投入策略与心理约束的量化决策。基于组合数学与二项分布的分析方法,可精确计算各奖项概率、评估不同玩法的实际回报效率,并构建个人资金-风险-目标模型。数据的价值不在于打破随机性,而在于识别非随机环节——如奖池跃升期的RTP波动、固定奖的保底收益、冷热号背后的分奖博弈结构。这种以决策优化为导向的数据实践,适用于将彩票视为受控实验的理性参与者,而非追求玄学中奖的投机者。

frank1998819 644

基于Java NIO的Socket通信

Java NIO模式的Socket通信,是一种同步非阻塞IO设计模式,它为Reactor模式实现提供了基础。 下面看看,Java实现的一个服务端和客户端通信的例子。 NIO模式的基本原理描述如下: 服务端打开一个通道(ServerSocketChannel),并向通道中注册一个选择器(Selector),这个选择器是与一些感兴趣的操作的标识(SelectionKey,即通过这个标识可以定位到

千与的专栏 2万+

PyGPT:桌面AI助手整合大模型与本地知识库,打造高效工作流

大语言模型(LLM)通过理解和生成自然语言,正深刻改变人机交互方式。其核心原理是基于海量数据训练的Transformer架构,能够根据上下文进行预测和生成。这一技术价值在于将强大的AI能力平民化,广泛应用于代码生成、文档分析、创意写作和智能问答等场景。通过API调用云端模型或本地部署开源模型,开发者可以构建个性化的AI应用。本文聚焦于PyGPT这一桌面AI助手,它巧妙地将ChatGPT、Claude、Gemini等主流大模型与LlamaIndex、Ollama等本地化工具整合,实现了聊天、文件分析、代码解释

weixin_28679635的博客 437

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

java socket nio_Java使用NIO包实现Socket通信的实例代码

前面几篇文章介绍了使用java.io和java.net类库实现的Socket通信,下面介绍一下使用java.nio类库实现的Socket。java.nio包是Java在1.4之后增加的,用来提高I/O操作的效率。在nio包中主要包括以下几个类或接口:Buffer:缓冲区,用来临时存放输入或输出数据。Charset:用来把Unicode字符编码和其它字符编码互转。Channel:数据传输通道,用来把...

weixin_42312941的博客 303

燧原科技云燧ESL64-O超节点:国产AI芯片与OEX光互联架构解析

分布式AI训练通过将计算任务拆分到多个节点并行执行来加速模型训练,其核心原理涉及数据并行和模型并行等策略。在技术价值层面,分布式训练能显著提升大规模深度学习任务的效率,但传统GPU集群常因网络通信瓶颈导致性能受限。OEX光互联架构作为解决通信瓶颈的关键创新,采用硅光技术实现高带宽、低延迟的节点内互联,优化了AI训练中的集合操作。这种硬件级优化特别适用于千亿参数大模型训练和科学计算等场景,能有效降低AI集群的总体拥有成本(TCO)。云燧ESL64-O超节点正是基于国产自研AI芯片与OEX架构的集成方案,为大规

weixin_29071809的博客 373
上一篇: ThreadLocal源码解析,以及ThreadLocal、ThreadLocalMap、Thread 三者之间的关系
下一篇: 基于 java nio 长连接实现的聊天室
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值