
1.1 进程之间的通信
进程指运行中的程序,进程的任务就是执行程序中的代码。以下例程1-1的EchoPlayer类是一个独立的Java程序,它可以在任意一台安装了JDK的主机上运行。EchoPlayer类不断读取用户从控制台输入的任意字符串XXX,然后输出echo:XXX。如果用户输入的字符串为“bye”,就结束程序。例程1-1为EchoPlayer类的源代码。
例程1-1 EchoPlayer.java

运行“java EchoPlayer”命令,就启动了EchoPlayer进程,该进程执行EchoPlayer类的main()方法。图1-2演示了EchoPlayer进程的运行过程,它从本地控制台中获得标准输入流和标准输出流。本地控制台为用户提供了基于命令行的用户界面,用户通过控制台与EchoPlayer进程交互。

图1-2 EchoPlayer进程的运行过程
提示
确切地说,运行“java EchoPlayer”命令,就启动了一个Java虚拟机(Java Virtual Machine,JVM)进程,该进程执行EchoPlayer类的main()方法。本书为了叙述方便,把运行EchoPlayer类的main()方法的JVM进程直接称为EchoPlayer进程。
EchoPlayer类的echo(String msg)方法负责生成响应结果。如果需要把生成响应结果的功能(即echo(String msg)方法)移动到一个远程主机上,那么上面的EchoPlayer类无法满足这一需求。在这种情况下,要创建两个程序:客户程序EchoClient和服务器程序EchoServer。EchoClient程序有两个作用:
·与用户交互,从本地控制台获得标准输入流和标准输出流。
·与远程的EchoServer通信,向EchoServer发送用户输入的字符串,接收EchoServer返回的响应结果,再把响应结果写到标准输出流。
EchoServer程序负责接收EchoClient发送的字符串,然后把响应结果发送给EchoClient。图1-3演示了EchoClient与EchoServer的通信过程。客户机和远程服务器是通过网络连接的两台主机。客户机上运行EchoClient进程,远程服务器上运行EchoServer进程。

图1-3 EchoClient与EchoServer通信
张三给李四打电话,两者顺利通话的前提条件是他们各自的电话机都连接到了电话网络上。张三和李四只需关注他们谈话的具体内容,而不必考虑如何把自己的话音传输到对方的电话机上。传输语音信息的任务是由电话网络来完成的。
同样,两个进程顺利通信的前提条件是它们所在的主机都连接到了计算机网络上。EchoClient与EchoServer只需关注它们通信的具体内容,例如EchoClient发送信息“hello”,那么EchoServer返回信息“echo:hello”。EchoClient和EchoServer都无须考虑如何把信息传输给对方。传输信息的任务是由计算机网络来完成的。
Java开发人员的任务是编写EchoClient和EchoServer程序,接下来在两台安装了JDK的主机上分别运行它们,两个进程就会有条不紊地通信。
由于进程之间的通信建立在计算机网络的基础上,Java开发人员有必要对计算机网络有基本的了解,这有助于更容易地掌握Java网络编程技术。