tcp nio 服务端、客户端例子--参考《分布式Java应用:基础与实践》

Java:实现Nio方式实现tcp通信 1. 声明 当前内容主要为复习使用Nio方式实现tcp通信,实现tcp之间的信号传递和解析 2. Server端 /** * * @author hy * @createTime 2022-02-12 09:48:24 * @description 当前内容为使用Nio方式操作socket进行通信操作 * */ public class NioServerSocketTest { public static void main(String[] args) { int threadCou 阅读详情

 

 

参考《分布式java应用》tcp nio 服务端、客户端例子, 在基础主要做了以下调整:

1. 信息长度由定长(ByteBuffer长度)修正为可变长(即不再收长度限制)

2. 特殊错误处理:read Exception,opposite close Exception,select timeout Exception(网络超时)。

 

read Exception 与 opposite close Exception 的处理, 用于解决发现异常后造成程序的 while死循环。

select timeout Exception的处理, 用于对网络超时的支持。

 

/**
 *
 */

package distributed.tcpnio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
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.nio.charset.Charset;

/**
 * 实现TCP/IP+NIO 方式的系统间通讯的代码,服务器端:
 * SocketChannel和ServerSocketChannel两个关键的类,网络IO 的操作则改为通过ByteBuffer来实现。
 *
 * @author yangwm in Mar 22, 2010 5:52:58 PM
 */
public class ServerTcpNio {

    /**
     * create by yangwm in Mar 22, 2010 5:52:58 PM
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        int port = 9527;
        System.out.println("Server listen on port: " + port);
       
        Selector selector = Selector.open();
       
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        ServerSocket serverSocket = serverChannel.socket();
        serverSocket.bind(new InetSocketAddress(port));
        serverChannel.configureBlocking(false);
       
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            int nKeys = selector.select();
            if (nKeys > 0) {
                for (SelectionKey selectionKey : selector.selectedKeys()) {
                    if (selectionKey.isAcceptable()) {
                        ServerSocketChannel tempServerChannel = (ServerSocketChannel)selectionKey.channel();
                        SocketChannel socketChannel = tempServerChannel.accept();
                        if (socketChannel == null) {
                            continue;
                        }
                       
                        socketChannel.configureBlocking(false);
                        socketChannel.register(selector, SelectionKey.OP_READ);
                    } else if (selectionKey.isReadable()) {
                        //try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
                        SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
                       
                        StringBuilder sb = new StringBuilder();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        try {
                            int readBytes = 0;
                            int ret = 0;
                            while ((ret = socketChannel.read(byteBuffer)) > 0) {
                                readBytes += ret;
                                byteBuffer.flip();
                               
                                sb.append(Charset.forName("UTF-8").decode(byteBuffer).toString());
                               
                                byteBuffer.clear();
                            }
                           
                            if (readBytes == 0) {
                                /*
                                 * handle Exception
                                 */
                                System.err.println("handle opposite close Exception");
                                socketChannel.close();
                            }
                           
                           
                            String message = sb.toString();
                            System.out.println("Message from client: " + message);
                            if ("quit".equalsIgnoreCase(message.toString().trim())) {
                                System.out.println("Client has been quit!");
                               
                                socketChannel.close();
                            } else if ("serverquit".equalsIgnoreCase(message.trim())) {
                                System.out.println("Server has been shutdown!");
                               
                                socketChannel.close();
                                serverChannel.close();
                                selector.close();
                                System.exit(0);
                            } else {
                                String outMessage = "Server response:" + message;
                                socketChannel.write(Charset.forName("UTF-8").encode(outMessage));
                            }
                        } catch (IOException e) {
                            /*
                             * handle Exception
                             */
                            System.err.println("handle read Exception");
                            socketChannel.close();
                        } finally {
                            byteBuffer.clear();
                        }
                       
                    }
                }
                selector.selectedKeys().clear();
               
            }
        }
    }

}

 

 

/**
 *
 */
package distributed.tcpnio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.nio.charset.Charset;

/**
 * 实现TCP/IP+NIO 方式的系统间通讯的代码,客户端:
 *
 * @author yangwm in Mar 22, 2010 10:19:51 PM
 */
public class ClientTcpNio {

    /**
     * create by yangwm in Mar 22, 2010 10:19:52 PM
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        String host = "127.0.0.1";
        int port = 9527;
       
        Selector selector = Selector.open();
       
        SocketChannel clientChannel = SocketChannel.open();
        clientChannel.configureBlocking(false);
        clientChannel.connect(new InetSocketAddress(host, port));
       
        clientChannel.register(selector, SelectionKey.OP_CONNECT);
       
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            if (clientChannel.isConnected()) {
                String command = systemIn.readLine();
                clientChannel.write(Charset.forName("UTF-8").encode(command));
               
                if (command == null || "quit".equalsIgnoreCase(command)) {
                    System.out.println("Client quit!");
                   
                    systemIn.close();
                    clientChannel.close();
                    selector.close();
                    System.exit(0);
                }
               
            }

            int nKeys = selector.select(3 * 1000);
            if (nKeys > 0) {
                for (SelectionKey selectionKey : selector.selectedKeys()) {
                    if (selectionKey.isConnectable()) {
                        SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
                        socketChannel.configureBlocking(false);
                        socketChannel.register(selector, SelectionKey.OP_READ);
                        socketChannel.finishConnect();
                    } else if (selectionKey.isReadable()) {
                        SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
                        StringBuilder sb = new StringBuilder();
                       
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        try {
                            int readBytes = 0;
                            int ret = 0;
                            while ((ret = socketChannel.read(byteBuffer)) > 0) {
                                readBytes += ret;
                                byteBuffer.flip();
                               
                                sb.append(Charset.forName("UTF-8").decode(byteBuffer).toString());
                               
                                byteBuffer.clear();
                            }
                           
                            if (readBytes == 0) {
                                /*
                                 * handle Exception
                                 */
                                System.err.println("handle opposite close Exception");
                                socketChannel.close();
                            }
                        } catch (IOException e) {
                            /*
                             * handle Exception
                             */
                            System.err.println("handle read Exception");
                            socketChannel.close();
                        } finally {
                            byteBuffer.clear();
                        }
                       
                        String message = sb.toString();
                        System.out.println(message);
                    }
                }
                selector.selectedKeys().clear();
               
            } else {
                /*
                 * handle Exception
                 */
                System.err.println("handle select timeout Exception");
                clientChannel.close();
            }
           
        }
    }

}

 

 

膜拜~ 终于拿到了美团老大哥分享的 Netty 源码剖析与应用 PDF Netty是一款基于NIO(非阻塞I/O)开发的网络框架,与传统BIO相比,它的并发性能得到了很大的提高,而且更加节省资源。Netty不仅封装了NIO操作的很多细节;在设计上还基于灵活、可扩展的事件驱动模型与高度可定制的线程模型,让Netty的应用更加灵活。作为一个被广泛使用的Java网络编程框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、物联网行业等都得到了广泛的应用。如需获取原文档参考学习👉私信获取!目录​。... 阅读详情

相关推荐

netty原理简介及服务端、客户端详细代码

netty底层是对NIO的封装,封装成像AIO的样子、改进了ByteBuffer,很好用。

qq_38639813的博客 608

nio java tcp_【Java TCP/IP Socket】基于NIO的TCP通信(含代码)

NIO主要原理及使用NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接、读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情,以实现线程的异步操作。考虑一个即时消息服务器,可能有上千个客户端同时连接到服务器,但是在任何时刻只有非常少量的消息需要读取和分发(如果采用线程池或者一线程一客户端方式,则会非常浪费...

weixin_35110501的博客 345

基于分段线性近似的Softmax硬件加速器设计

本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。

weixin_28278377的博客 313

Java NIO之TCP

流( TCP )信道详解 流信道有两个变体: SocketChannel 和 ServerSocketChannel 。像其对应的 Socket 一样,SocketChannel 是相互连接的终端进行通信的信道。 l  SocketChannel :创建,连接和关闭     static SocketChannel open(SocketAddress remote)     static

mInfoDavid的专栏 1004

esxi8.0.3如何添加USB外置硬盘

本文介绍了在ESXi系统中配置外置USB硬盘作为数据存储的完整步骤:1)通过SSH禁用USB仲裁服务并关闭自启;2)识别已连接的USB硬盘设备路径;3)使用partedUtil创建GPT分区表并计算扇区范围;4)设置VMFS6分区并格式化。关键命令包括停止usbarbitrator服务、partedUtil分区操作以及vmkfstools格式化命令。整个过程需通过SSH执行,最终将USB硬盘配置为名为"USB_Datastore"的VMFS6存储设备。

qq_41683719的博客 1546

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2031

五、Java NIO 深入解读--TCP粘包、拆包

TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,,将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的。由于 TCP 无消息保护边界, 需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题。

qq_41925134的博客 730

Simulink模块库介绍(一)——信号源模块

Simulink模块库介绍(一)——信号源模块库目录Clock模块Digital Clock模块Band-Limited White Noise模块 目录 simulink模块库中提供了丰富的信号源模块组。逐一介绍,算是对之前做个总结吧 Clock模块 通过时钟模块,输出的时间作为判断呢,如下图,前2s之前为高斯白噪声,后2s为正弦曲线,共计10s。 Digital Clock模块 数字时钟模块主要用于离散系统的计时,sample time表示采用时间,如下图:分别是1s和0.5s的采样时间 Band-

5万+

Java 网络编程之TCP(三):基于NIO实现服务端,BIO实现客户端

3.Selector:选择器,就是Linux 内核中的IO多路复用器,为了提高网络IO编程的效率,常用的有select, poll, epoll, 可以参考Linux对应系统调用。前面的文章,我们讲述了BIO的概念,以及编程模型,由于BIO中服务器端的一些阻塞的点,导致服务端对于每一个客户端连接,都要开辟一个线程来处理,导致资源浪费,效率低。先开启服务端,再开启两个客户端发送数据,服务端接受连接后,会打印当前接受到的客户端总数,然后轮询接收数据后打印;客户端:基于BIO,连接服务端,并发送数据。

u013771019的专栏 1159

QT使用libssh2库通过密匙实现sftp协议上传文件

qt下使用libssh2通过密匙连接sftp服务器端

小米的修行之路 945

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(三)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A.错误B.正确参考答案:BA.getB.try_getC.peekD.put参考答案:B。

qq_42135020的博客 1917

分布式通信之Java IO

IO IO概述 1.首先注意IO是InputStream(输入流)和OutputStream(输出流)的缩写 2.这里的InputStream实际上是一个集合,很多集成InputStream的子类都是; 3.我们这里的InputStream(输入流)和OutputStream(输出流)是针对的系统内存来讲的; 将数据(本地磁盘或者网络中的数据)读取写入内存,叫输入; 将内存中的数据...

高新富的博客 505

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2637

hbase 客户端_HBase源码:网络通信篇

导读在分布式存储系统中,节点间的通信是很重要的组成部分。如果不了解系统中的通信机制,就无法真正理解一套完整的读写流程。由于HBase年代久远(1.2.0版本),暂时使用的还是java原生的NIO,并没有使用Netty之类的框架。本篇就来介绍下HBase中基于NIO的RPC通信。1 RPC=protobuf+nioHBase基于protobuf+nio实现rpc:基于protobuf预定义消息格式,...

weixin_39887577的博客 361

MIC:最大信息系数

目录 1. 概念 1.1 MIC 1.2 互信息 2.MIC的优点 3. 算法原理 3.1 MIC公式原理 3.2MIC计算步骤 (1)计算最大互信息值 (2)对最大的互信息值进行归一化 (3)选择不同尺度下互信息的最大值作为MIC值 4. 代码实现 6. 其他方法 1. 概念 1.1 MIC MIC,即(Maximal Information...

满腹的小不甘 5万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 分布式rpc调用_如何实现一个分布式RPC框架

远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC的主要目标是让构建分布式应用更加容易,在提供强大的远程调用能力的同时不损失本地调用的语义的简洁性。趁实习前的这段业余时间,我实现了一个轻量级的分布式RPC框架,名字叫做 buddha,代码量不大,但是麻雀虽小却...

weixin_32380501的博客 228

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

还没使用过消息队列?这一份书单值得你好好看看!

点击蓝色“程序员书单”关注我哟 加个“星标”,每天带你读好书! Java工程师往往容易忽视的一块知识点,其实就是Java网络编程,为什么呢,因为如果我想写一个Java Web项目,我只要用SSM就可以轻松搞定,写好我们的controller、service和dao就可以了,也就是只需要关心业务逻辑,不需要关心前端请求的路由、甚至是后端的负载均衡和网络请求处理,因为这些东西很多时候都被Nginx和Tomcat给吃掉了,Nginx帮我们做好了负载均衡,Tomcat则帮我们完成TCP连接的建立,HT.

程序员书单 838

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何实现一个分布式 RPC 框架

远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC的主要目标是让构建分布式应用更加容易,在提供强大的远程调用能力的同时不损失本地调用的语义的简洁性。 趁实习前的这段业余时间,我实现了一个轻量级的分布式RPC框架,名字叫做 buddha,代码量不大,但是麻

GarfieldEr007的专栏 979

如何实现一个分布式RPC框架

远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC的主要目标是让构建分布式应用更加容易,在提供强大的远程调用能力的同时不损失本地调用的语义的简洁性。 趁实习前的这段业余时间,我实现了一个轻量级的分布式RPC框架,名字叫做 buddha(htt

程序文摘(CodeDigest) 1228

最新网络应用扛把子:阿里高工手写Netty速成手册,带你走向实战(1),成功入职阿里月薪45K

为了让更多的开发人员学习好Netty,特此公布:阿里高工手写的13万字的“Netty速成手册”。面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer。Netty协议栈功能设计+Netty协议栈开发+运行协议栈**)**第三部分:高级篇 Netty 多协议开发和应用。第二部分:中级篇 Netty 编解码开发。第四部分 Netty 功能介绍和源码分析。第一部分:基础 走进Java NIO。

2401_84584338的博客 643

面试官:讲讲七层网络模型与TCP三次握手与四次挥手?

目前,很多面试场景都开始重视基础知识的考察,比如:操作系统、IO(BIO、NIO、AIO)、网络、数据结构和算法等等。这不,就有小伙伴被面试官问到了网络的七层模型和TCP三次握手与四次...

dabaoshiwode的博客 470

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

Netty 是 Java 网络编程领域最流行的 NIO 框架,其**简单易用**和**高扩展性**使其成为构建高并发、高吞吐量网络服务的首选。本文通过对 Netty 主要组件、常见问题及解决方案的详细讲解,帮助读者了解并掌握 Netty 的开发方法。

qq_36534560的博客 1040

netty基础概念

参考对于Netty的十一个疑问 先理解相关概念 一、阻塞与非阻塞:数据没准备好,要不要死等? 阻塞:1、读取数据没准备好时,等待数据返回(死等);2、写操作时缓冲区数据满了,等待数据被消费(死等); 非阻塞:读取数据没准备好或写缓冲满时,都直接返回。 二、同步与异步:数据准备好后,谁来主动操作? 数据准备就绪后,数据操作谁来完成? 数据准备就绪后需要调用方主动来读就是同步;数据准备...

越自律越自由 993

Netty(四)——HTTP服务端之例

        HTTP(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。我们用的tomcat、jetty、jobss等各种服务器,其实就是一个服务端容器,方便我们直接部署我们应用,让用户通过使用客户端(WEB浏览器、手机H5、app等)借住HTTP协议,来完成信息的提交和获取。这篇文章简单总结一...

学会改变自己——才能突破 1815

Java后端开发-随记

不知道要分享啥,把之前整理的一份稳定CV下;近期在胡天乱想啥都想学习一下~,感觉编程语言、中间价框架都是基于需求主导推进~后面深度研究研究Ai,把mac的性能释放出来~下面的内容是我前一月的信息汇总,很多地方会有不足,仅供参考。当时是我想到啥写啥,也没有进行很深度地修订!

NEWstyle_的博客 824
上一篇: Java并发编程--三个线程顺序打印ABC
下一篇: 体验eclipse4
yangwm
博客等级 码龄20年 38粉丝 55原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值