消息在两台计算机的进程之间传递
客户端/服务器设计模式:客户端发起通信,服务器接 收、处理、回复,重复此过程,客户端断开连接。服务器可同时处理多个客 户端,客户端也可同时连接多个服务器。 客户机和服务器可在不同的计算机上,也 可在一台计算机上。
IP地址:网络接口由IP地址标识。 IPv4地址是以四个8位部分写入的32位数字。例子:18.9.22.69
主机名:主机名是可以翻译成IP地址的名称。
单个主机名可以在不同的时间映射到不同的IP地址,并且多个主机名可以映射到相同的IP地址
从主机名到IP地址的转换是域名系统(DNS)的工作。
端口号:一台机器可能有多个客户端希望连接的服务器应用程序,因此我们需要一种方法将流量通过同一个网络接口导向不同的进程。
网络接口有多个由0到65535之间的16位字标识的端口
服务器进程绑定到特定的端口,在该端口上进行侦听。 客户必须知道服务器正在侦听哪个端口号。当客户 端连接到服务器时,该连接还使用客户端网络接口上的端口号
网络套接字:套接字(socket)是用于发送和接收数据的网络连接中的端点(socket本质API,对TCP/IP的封装)
传输协议:TCP或UDP(或原始IP,但不包含在Java中)
套接字地址:本地或远程IP地址和端口号
套接字使网络I / O感觉像文件I / O支持读取,写入,打开和关闭操作,符合Unix哲学“一切都是文件”。
服务器进程使用侦听套接字等待来自远程客户端的连接。
连接成功的套接字可以发送和接收来自连接另一端的进程消息,通过本地和远程计算机的IP地址和端口号区分两端计算机
在Java中,客户端使用Socket构造函数建立到服务器的套接字连接。 服务器从ServerSocket.accept返回的Socket对象获取连接的套接字
java中的TCP网络 - java.net
I/O缓冲区:客户端和服务器通过网络交换的数据以块的形式发送
数据块可大可小。
网络将这些数据块分成数据包,每个包通过网络分别路由,另一端,接收器将数据包重新组成一个字节流
有时需要等待数据到达重组 ,当数据到达时,进入buffer,等待读取。
套接字输入/ 输出流表现出阻塞行为: 当传入的套接字缓冲区为空时,读取操作为阻塞,块直到数据 可用。
当目标套接字缓冲区已满时,写入操作呗阻塞,直到空间可用 。
创建服务器端和客户端套接字并写入和读取其I / O流
基于ASCII的有线协议。HTTP FTP SMTP
消息传递与线程
在客户端和服务端的进程间传递消息
在同一进程的线程间传递消息,比通过锁定机制共享内存更受欢迎
使用同步队列在线程之间传递消息
JAVA怎么实现消息传递:Java为阻塞操作的队列提供了BlockingQueue接口
该队列不能用add和remove,应用put和take
支持在删除(take)元素时等待队列变为非 空,在存储(put)元素时等待队列中的空间变得可用
线程间消息传递的生产者 - 消费者设计模式。
- 生产者线程和使用者线程共享一个同步队列。
- 生产者将数据或请求放入队列中,消费者将其删除并处理。
- 一个或多个生产者和一个或多个消费者可能都在添加和删除同一队列中的项目。
此队列对于并发必须安全
可以保存任意类型的对象
ArrayBlockingQueue是一个使用数组表示的固定大小的队列。 如果队列已满,则在队列中放置一个新项目会阻塞。
LinkedBlockingQueue是一个使用链表表示的可扩展队列。 如果没有指定最大容量,队列将永远不会填满,因此放入永远不会阻塞
必须是不可变类型 避免竞争 使客户端可以执行需要的原子操作
关闭:在C/S模式下,可以关闭socket以停 止客户端或者服务器继续侦听消息。 如果期望服务器和客户端同时关闭,可以退出进程。
一种不推荐的策略:使用特殊的消息提示结束(如0,或者 null),但是魔数或者null都不是推荐的方式
通过阻塞队列的方式是单进 程内部线程间通信的有用方式
相比通过锁进行同步,消息传递同步是依靠消息通道进行共享 。
原文地址:https://www.cnblogs.com/xgl122/p/9201311.html