可以这样说:我们在网络上只做一件事,利用各种软件没完没了的相互通信。
对于单机系统而言,进程在系统中有自己唯一的进程号。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。而且
操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。
为此,TCP/IP协议为网间进程通信问题建立了IP地址,端口,Socket(套接字)等概念。
(1) IP地址
IP地址是连入网络中的机器的唯一识别地址。信息可以根据IP选择路由方向,从而找到目的地机器。这就像
邮递员(路由器)根据你们家房子(目的机器)的地址(IP地址)递送包裹(信息)
。
(2) 端口
我们知道,一台拥有IP地址的主机可以提供许多服 务,比如web服务、FTP服务、SMTP服务等。对于不同的服务请求,主机需要调用不同的程序进行处理。可是主机怎么知道是什么服务请求那?显然仅仅知道IP地址是不够的,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
端口实质上是抽象的软件结构(不要理解成机器上的USB插槽),它包括一些数据结构和I/O(基本输入输出)缓冲区。系统会为这些数据结构和缓冲区指定一个唯一的端口号。不同的端口号对应提供不同服务的程序。比如80号端口是HTTP端口,当要申请主机的HTTP服务时,我们将申请信息发送到指定IP的80号端口的数据结构内。这时主机会监听到80号端口有服务请求,自动调用HTTP服务进程进行服务。
如果说IP地址是你家房子的地址,那么端口就是你家的门(这个房子确实门多了点)。不同的访客走不同的门,行贿的家伙一定要走后门(不排除小偷翻窗户的可能)
。当你听到后门有人敲门的时候,嘿嘿......
(3) Socket 套接字
有的时候,多个应用程序可能同时需要向同一个接口发送数据
。为了区别不同的应用程序进程和连接
,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意
是
“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动
建立关系。此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端
口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的
发送与接收的。
了解了基于TCP/IP协议的网间进程通信的部分概念之后,现在我想写一个Java版的C-S通信程序。既然应用程序需要通过"套接字"向网络发出请求或者应答网络请求。我们自然要为客户端和服务器端的程序创建自己的Socket。
还好,JDK中就有我们想要的东西——Socket和ServerSocket类。简单介绍一下这两个类:
Socket类用于客户端,为建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
ServerSocket类用于服务器端,他可以创建绑定到特定端口的服务器套接字。当监听到端口内容时,他将创建一个用于链接的Socket对象。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是
ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
//客户端程序,用于向服务器端发送一句“hello server!”
import java.net.*;
import java.io.*;
public class Client{
private String ipTo="172.16.129.13";//服务器端IP地址
private int port=8189;//需要通过的服务器端口号
public void hello(){
try{
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket clientSocket=new Socket(ipTo,port);
try{
System.out.println("success connection....");
//返回此套接字的输出流
OutputStream os=clientSocket.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
pw.println("hello server!");
}
finally{
clientSocket.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
Client client=new Client();
client.hello();
}
}
//服务器端程序,用于接受客户端的信息
import java.net.*;
import java.io.*;
public class Server{
private int lisenerPort=8189;//监听端口
private void lisener(){
try{
//创建服务器端套接字,用于绑定指定端口
ServerSocket serverSocket=new ServerSocket(lisenerPort);
//监听绑定的端口,用于产生阻塞,直到接受到一个来自客户端的有效连接,并且返回一个客户端的Socket对象实例。
Socket socket=serverSocket.accept();
try{
//创建套接字输入流
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//服务器端显示来自客户端的问候
System.out.println(br.readLine());
}
finally{
serverSocket.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
Server server=new Server();
server.lisener();
}
}
分享到:
相关推荐
- **套接字(Socket)**:支持网络通信,广泛应用于不同机器间的进程通信。 - **信号(Signal)**:轻量级的进程间通信方式,用于进程异常处理或简单通知。 4. **实例源代码分析** - **管道通信**:学习创建管道...
#### 进程通信方法 - **BSD(Berkeley Software Distribution)风格**: - **Pipe**:管道是一种用于进程间通信的机制,支持单向通信。它通过一个特殊的文件来实现,用于连接两个进程的标准输入和标准输出。 - **...
信号量和事件用于同步多个进程的访问,共享内存则允许进程直接共享内存区域,而套接字通常用于跨网络的进程间通信。 在实际开发中,选择合适的进程间通信方式需要考虑诸多因素,包括数据量、实时性需求、安全性、...
QT框架中的多进程通信是开发复杂应用程序时的关键技术,它允许不同进程之间交换数据和执行协同操作。在本示例中,"QT 多进程通信"着重展示了如何使用QProcess和QSharedMemory来实现进程间的通信。 QProcess是QT库中...
在IT领域,进程通信是多任务操作系统中一个关键的概念,特别是在分布式系统和并行计算环境中。本项目聚焦于“利用共享内存实现进程通信”,这是一种高效且直接的数据交换方式,尤其适用于需要快速同步和数据交换的...
在这个示例中,"QtIPC"可能包含了实现以上功能的源代码文件,包括了如何初始化QSharedMemory、如何设置和操作QSystemSemaphore,以及如何在不同进程中正确处理这些对象的示例代码。通过分析和学习这些代码,开发者...
操作系统实验报告的主题聚焦在进程通信和同步机构,特别是如何通过PV操作解决生产者-消费者问题。PV操作是荷兰计算机科学家Dijkstra提出的同步原语,它包括P操作(代表"Procedure wait",即进程等待)和V操作(代表...
在Linux操作系统中,多进程通信(IPC,Inter-Process Communication)是实现不同进程间数据交换的关键技术。本示例通过信号量和共享内存这两种IPC机制,展示了如何在多个进程中有效地协同工作。信号量用于同步对共享...
5. **错误处理**:编写代码时,必须考虑可能出现的错误情况,如进程通信失败、资源竞争等,并进行适当的错误处理。 6. **测试与调试**:最后,设计测试用例以确保通信机制的正确性,使用调试工具检查程序的运行状态...
- `set_semvalue()`函数设置信号量的初始值为1,这表示资源(屏幕)可以被一个进程占用。 - `sem_p()`函数是信号量的"等待"操作,即尝试获取信号量。如果信号量值为0,则进程将被阻塞直到信号量变为非零;否则,信号...
在IT领域,进程通信是操作系统中的重要概念,它是指不同进程之间交换信息的过程。在这个主题中,我们将深入探讨`SendMessage`、`CreateEvent`和`SetEvent`这三种Windows API函数,它们在进程通信中扮演着关键角色。 ...
### Visual C++ 实现进程间通信详解 #### 进程间通信的重要性与背景 在Windows系统环境下,进程间通信(IPC)是多个独立运行的进程能够互相协作、共享信息的关键技术。随着操作系统的演进,从早期的16位Windows 3....
在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序或同一应用内不同进程之间数据共享和协同工作的重要手段。"Messenger进程间通信"是一种轻量级的IPC方式,常用于简单的双向通信...
2. **套接字(Sockets)**:套接字是网络通信的基础,可以用于不同机器间的进程通信。VB提供Winsock控件来处理TCP/IP和UDP协议的套接字通信。 3. **共享内存(Shared Memory)**:通过创建共享内存段,多个进程可以访问...
在数据库、网络服务器、分布式系统等多进程环境中,这些同步机制经常被用来协调不同进程对共享资源的访问,如并发请求处理、数据一致性维护等。 总结来说,互斥锁、条件变量和共享内存是Linux下实现进程间通信的...
根据提供的文件信息,本文将详细解析Ceph中的进程间通信机制、MDS集群及负载均衡架构等内容。 ### Ceph通信机制概述 Ceph是一个分布式存储系统,它支持块存储、对象存储以及文件系统存储等多种存储服务。为了实现...
《NngTEST.tar.gz:NNG进程间通信与Doem示例详解》 NngTEST.tar.gz 是一个包含了NNG(Not Only NATS)库在进程间通信中的应用实例的压缩包。NNG是一个轻量级的消息传递库,旨在提供简单、高效的网络通信能力,支持...
易语言进程通信源码,进程通信,收到信息,收到图片,收到文件,接收端_初始化,接收端_开始监听,接收端_关闭监听,接收端_停止监听,接收端_取出数据,接收端_清除数据,接收端_清空数据,发送端_发送数据,接收端_读数据,取得...
总结来说,"利用消息实现进程之间的通信"涉及到操作系统级别的进程通信技术,通过消息队列实现进程间的协作与数据交换。这一方法在多种操作系统中都有实现,并且有其独特的优势和适用场景。理解并掌握这一机制对于...
- 实现简单的父子进程通信。 - **示例**: 使用`ps -ef | grep ntp`来演示管道的工作原理。其中`ps -ef`命令用于列出所有进程的信息,而`grep ntp`则用于筛选出与ntp相关的进程信息。这两条命令通过管道连接起来...