Java 网络编程疑问

2019-09-28 00:20:00 +08:00
 nvioue

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

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

3100 次点击
所在节点    程序员
16 条回复
sagaxu
2019-09-28 00:25:55 +08:00
不要问,问就是 netty,chain 上分层回调,想省点力气就套个 rxjava。如果是新项目,kotlin 协程真香。
PHPer233
2019-09-28 00:31:07 +08:00
Java 编程就是复制粘贴,直接用别人的类库就行了,流程跑通业务上线就下班回家睡觉。
zgcwkj
2019-09-28 01:42:36 +08:00
cpp 不是文件格式吗?不应该叫 c++吗?
zydxn
2019-09-28 02:09:52 +08:00
@zgcwkj c plus plus ; CPP
wolfish
2019-09-28 02:10:21 +08:00
和楼主一样,刚转 java 没多久。java 有一套 nio 类库,实际内部应该也是调用的 epoll
towser
2019-09-28 06:47:38 +08:00
JDK1.5 update10 后也支持 epoll。
如果问的是网络编程框架,JAVA 当然是 Netty,在 Linux 下也是基于 epool 实现非阻塞 IO。
MoHen9
2019-09-28 07:22:54 +08:00
现在大部分网络 IO 是基于 netty 的,可以把 GitHub 上的源码 down 下来看看,Linux 上也可以用 epoll,基于多线程实现。封装非常棒,所有的操作都是同一套 API,支持 BIO/NIO,UDP/TCP。
Variazioni
2019-09-28 08:52:32 +08:00
欢迎来到新世界。。。
phantomzz
2019-09-28 09:04:59 +08:00
java 是提供了对 epoll 的封装,在 NIO 中,但是 NIO 编程复杂且成本高,所以我们都是用 netty 多一些,从 spring5 开始,异步响应式编程也开始成为主流,比如 Spring WebFlux。
wnpllrzodiac
2019-09-28 10:02:39 +08:00
@PHPer233 有同感,都是用别人的轮子组业务逻辑。别人的轮子漏气了或者长歪了,只能凑活着用。说不定别人的轮子还就是方的,跑起来咯的厉害
zhuangzhuang1988
2019-09-28 10:09:13 +08:00
cpp 协程 ? 哪个库?
hkitdog
2019-09-28 10:42:53 +08:00
写 Java 都是直接抄开源代码,没有人在意底层
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
2019-09-28 11:28:00 +08:00
没错,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
2019-09-28 11:45:27 +08:00
@zhuangzhuang1988 南方某厂 内部自研的。其实核心部分就是十几行汇编而已啦
daimiaopeng
2019-09-30 18:20:59 +08:00
@zhuangzhuang1988 libco 腾讯的开源库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604984

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX