Java 网络编程疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
nvioue
V2EX    程序员

Java 网络编程疑问

  •  
      nvioue 2019-09-28 00:20:00 +08:00 via Android 3720 次点击
    这是一个创建于 2240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人背景是多年 cpp 转 Java。用了一阵公司自研框架也看了下 spring 的,比较疑惑,cpp 通常使用协程或者异步状态机来搞网络编程。那么 Java 里面对等的实现分别是什么?

    Java 的类库实在太多,层层引用,看的我真是头大,想省点时间求助网友。cpp 基本没有啥秘密可言 问就是 epoll。

    16 条回复    2019-09-30 18:20:59 +08:00
    sagaxu
        1
    sagaxu  
       2019-09-28 00:25:55 +08:00 via Android
    不要问,问就是 netty,chain 上分层回调,想省点力气就套个 rxjava。如果是新项目,kotlin 协程真香。
    PHPer233
        2
    PHPer233  
       2019-09-28 00:31:07 +08:00 via Android
    Java 编程就是复制粘贴,直接用别人的类库就行了,流程跑通业务上线就下班回家睡觉。
    zgcwkj
        3
    zgcwkj  
       2019-09-28 01:42:36 +08:00
    cpp 不是文件格式吗?不应该叫 c++吗?
    zydxn
        4
    zydxn  
       2019-09-28 02:09:52 +08:00
    @zgcwkj c plus plus ; CPP
    wolfish
        5
    wolfish  
       2019-09-28 02:10:21 +08:00
    和楼主一样,刚转 java 没多久。java 有一套 nio 类库,实际内部应该也是调用的 epoll
    towser
        6
    towser  
       2019-09-28 06:47:38 +08:00
    JDK1.5 update10 后也支持 epoll。
    如果问的是网络编程框架,JAVA 当然是 Netty,在 Linux 下也是基于 epool 实现非阻塞 IO。
    MoHen9
        7
    MoHen9  
       2019-09-28 07:22:54 +08:00 via Android
    现在大部分网络 IO 是基于 netty 的,可以把 GitHub 上的源码 down 下来看看,Linux 上也可以用 epoll,基于多线程实现。封装非常棒,所有的操作都是同一套 API,支持 BIO/NIO,UDP/TCP。
    Variazioni
        8
    Variazioni  
       2019-09-28 08:52:32 +08:00
    欢迎来到新世界。。。
    0NF09LJPS51k57uH
        9
    0NF09LJPS51k57uH  
       2019-09-28 09:04:59 +08:00
    java 是提供了对 epoll 的封装,在 NIO 中,但是 NIO 编程复杂且成本高,所以我们都是用 netty 多一些,从 spring5 开始,异步响应式编程也开始成为主流,比如 Spring WebFlux。
    wnpllrzodiac
        10
    wnpllrzodiac  
       2019-09-28 10:02:39 +08:00 via Android
    @PHPer233 有同感,都是用别人的轮子组业务逻辑。别人的轮子漏气了或者长歪了,只能凑活着用。说不定别人的轮子还就是方的,跑起来咯的厉害
    zhuangzhuang1988
        11
    zhuangzhuang1988  
       2019-09-28 10:09:13 +08:00
    cpp 协程 ? 哪个库?
    hkitdog
        12
    hkitdog  
       2019-09-28 10:42:53 +08:00 via iPhone
    写 Java 都是直接抄开源代码,没有人在意底层
    lisces
        13
    lisces  
       2019-09-28 11:08:38 +08:00
    网络编程最优先的不应该是网络库么,java 是通过 io(nio) + net + servlet + 容器来提供完整的网络链路的,这套官方组合稳当但是效率不高,现在基本都流行 netty 了。异步方案 Java 官方没有提供协程实现,基于 JVM 的 Kotlin 倒是有协程,可以和 Java 混用。Java 原生的异步通过线程来实现,cocurrent 包下面提供的 ExecutorService 之类的方式实现多线程,Future+Callable 的方式实现回调获取结果。这套官方实现比较简陋,现在一样流行第三方的框架封装,老牌的 akka,新贵 rxjava,集成了 rxjava 的 vertx 等。
    exceptionplayer1
        14
    exceptionplayer1  
       2019-09-28 11:28:00 +08:00   2
    没错,Java 的问题就在于此,它的开源框架太多,用的时候爽,但是出问题排查的时候比较头大,就像你说的,层层嵌套;但是这也是他的优点。
    关于协程,目前 java 并没有提供类似机制,但是目前 OpenJDK 里有一个 Loom 项目,是一种对用户态线程的探索,不确定效果如何,可能会合并到后面的 JDK 版本中。
    网络编程 Java13 以前提供了两种,基于阻塞模式的 SocketAPI 和基于多路复用的 NIO。NIO 性能更高一些,但是 JDK 本身提供的 API 用起来难度较大,比较容易出错,所以 Java13 的最近的一次更新提供了一套新的 SocketAPI,简化使用,同时也为了 Loom 项目提供了一些前提支持。
    目前 Java 体系开发网络应用,一般都使用开源的 Netty 框架,Netty 提供了基于阻塞和多路复用的 API,同时支持 Epoll 模式,同时他抽象了常用的网络开发流程,使得通过 Netty 开发网络应用更方便快捷。当然要用得好还是需要一定的学习成本。另外与 Netty 类似的还有 Mina,需要说明的是 Netty 和 Mina 都是由同一个人主导开发的,Netty 是后来的版本,所以目前 Java 生态里基本都是用 Netty。
    nvioue
        15
    nvioue  
    OP
       2019-09-28 11:45:27 +08:00 via Android
    @zhuangzhuang1988 南方某厂 内部自研的。其实核心部分就是十几行汇编而已啦
    labubu
        16
    labubu  
       2019-09-30 18:20:59 +08:00 via Android
    @zhuangzhuang1988 libco 腾讯的开源库
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2380 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 15:46 PVG 23:46 LAX 07:46 JFK 10:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86