对于分布式 Java 应用,各个系统间的通信方式有消息方式及远程调用方式。基于消息方式实现的系统间通信,消息可以是字节流、字节数组,甚至是 Java 对象,系统接收到消息后进行相应的业务处理。消息方式的系统间通信,通常基于网络协议来实现,例如 TCP 和 UDP。TCP 和 UDP 协议可用于完成数据传输,但要完成系统间通信,还需要对数据进行处理,比如数据的读写操作。按照 POSIX 标准分为同步 IO 和异步 IO 两种。其中同步 IO 中最常用的是 BIO(Blocking IO)和 NIO(Non-Blocking IO)。
Blocking IO,顾名思义,就是发起 IO 的读写操作是,均为阻塞方式,只有当程序读到了流或将流写入操作系统后,才会释放资源。
Non-Blocking IO 是基于事件驱动思想的,实现上通常采用 Reactor 模式。当发起 IO 的读写操作时,是非阻塞的;当 Socket 有流可读或可写入 Socket 时,操作系统会相应地通知应用程序进行处理,应用程序再将流读取到缓冲区,或写入操作系统。使用 Java 自身包可实现基于 TCP 或 UDP 的 BIO 或 NIO 四种系统间通信方式。这里使用 TCP+BIO 以及 TCP+NIO 来实现一个简单的 Echo 服务器(即从客户端控制台输入一个字符串,该字符串发送到服务器后,再回传到客户端,客户端再将该字符在控制台原样打印),以对这两种方式做一个总结记录。
最最基本的 Socket 程序
首先是一个最基本最简单的基于 Socket 的系统间通信的例子,对于服务器端程序,建立一个 ServerSocket 监听,并使用 Socket 获取输出流输出,关键代码如下:
try (ServerSocket server = new ServerSocket()) {
InetSocketAddress isa = new InetSocketAddress(ADDR, PORT);
server.bind(isa);
while(true) {
Socket s = server.accept();
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("you have connected to the server");
}
} catch (Exception e) {
e.printStackTrace();
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于