V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nvioue
V2EX  ›  程序员

Java 网络编程疑问

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

    本人背景是多年 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
    欢迎来到新世界。。。
    phantomzz
        9
    phantomzz  
       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 南方某厂 内部自研的。其实核心部分就是十几行汇编而已啦
    daimiaopeng
        16
    daimiaopeng  
       2019-09-30 18:20:59 +08:00 via Android
    @zhuangzhuang1988 libco 腾讯的开源库
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3684 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:49 · PVG 08:49 · LAX 17:49 · JFK 20:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.