软件构造 消息传递

消息在两台计算机的进程之间传递

客户端/服务器设计模式:客户端发起通信,服务器接 收、处理、回复,重复此过程,客户端断开连接。服务器可同时处理多个客 户端,客户端也可同时连接多个服务器。                客户机和服务器可在不同的计算机上,也 可在一台计算机上。

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

时间: 2024-10-31 11:58:22

软件构造 消息传递的相关文章

【软件构造】第一章 软件构造基础(2)

二.软件构造的质量目标 1. 外部属性(主要):影响用户感受,如外观.速度等 (1)正确性:符合规格范围和计划目标 ·只保证各个层面的正确性(假设调用正确) ·检验与调试 ·防御性编程 ·形式化编程 (2)健壮性:响应规格范围外的异常情况 ·提示错误信息 ·正常退出或降级 (3)可扩展性:提供增加新功能的空间 ·固化需求以规避风险 ·设计简洁.离散化 (4)可复用性:使软件模块能够被其他程序使用 ·模式固化 (5)兼容性:跨平台.跨软件交互 ·使用标准文件格式.数据结构.接口,保持一致性 ·定义

麻省理工18年春软件构造课程阅读04“代码评审”

本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材取自此,也是推荐的阅读材料之一,于是打算做一些翻译工作,自己学习的同时也能帮到一些懒得看英文的朋友.另外,该课程的阅读资料中有许多练习题,但是没有标准答案,所给出的答案均为译者所写,有错误的地方还请指出. 译者:李秋豪 审校: V1.0 Thu Mar 8 22:58:41 CST 2018 本次课

【软件构造】第二章第二节 软件构造的过程、系统和工具

第二章第二节 软件构造的过程.系统和工具 Outline 广义的软件构造过程 编程 静态代码分析 动态代码分析 调试与测试 重构 狭义的软件构造过程 构造系统:经典BUILD场景 构造系统的组件 构造过程和构造描述 Java编译工具 子目标和结构变体 构造工具 Notes ## 广义的软件构造过程 [编程(Coding)] 开发语言:如Java.C.Python 使用IDE(集成开发工具)的优势(组成) 方便编写代码和管理文件(有代码编辑器,代码重构工具.文件和库(Library)管理工具) 能

【软件构造】第六章第一节 可维护性的度量与构造原则

第六章第一节 可维护性的度量与构造原则 本章面向另一个质量指标:可维护性--软件发生变化时,是否可以以很小的代价适应变化? 本节是宏观介绍:(1)什么是软件维护:(2)可维护性如何度量:(3)实现高可维护性的设计原则--很抽象. Outline 软件的维护和演化 可维护性的常见度量指标 聚合度与耦合度 面向对象五大原则SOLID 单一职责原则SRP(Single Responsibility Principle) 开放封闭原则OCP(Open-Close Principle) 里式替换原则LSP

软件构造2

HIT - 软件构造 3章: 基本数据类型:int,long,boolean,double,char,short,byte,float 对象数据类型:classes,interface,arrays,enums,annotations Java是一种静态类型的语言,所有变量的类型在编译是已知的,Java可以静态检查,在像python这样的动态类型语言中,这种检查被推迟到运行时. 静态检查的类型:语法错误,名字错误,参数个数错误,参数类型错误,返回错误 动态检查的类型:非法参数,非法返回值,数组越

软件构造

1-2章: 1. 软件构造的多维度视图 2.软件构造的阶段划分.各阶段的构造活动 3.内部/外部的质量指标 4.软件配置管理SCM与版本控制系统VCS 5. Git/GitHub 多维视图: Build-time :想法->需求->设计->代码->安装/可抽象的包 run-time:程序在目标机器内部运行时的外观如何,目标机器加载到内存中所有的磁盘文件是什么 Component-level :体系结构->源代码是如何由文件,目录包,库之间的依赖物理组织在一起 软件构造五大关键

【软件构造】第七章第一节 健壮性和正确性的区别

第七章第一节  健壮性和正确性的区别 第七章:进入软件构造最关键的质量特性 --健壮性和正确性. 本节在1-2节的基础上,重申了Robustness and Correctness的重要性,澄清了二者之 间的差异,并指明了在软件构造中处理二 者的典型技术(防御式编程.异常处理. 测试.调试等) Outline 健壮性(Robustness)和正确性(correctness) 如何测量健壮性和正确性 Notes ## 健壮性(Robustness)和正确性(correctness) [健壮性] 定

软件构造 第三章第三节 抽象数据型(ADT)

软件构造 第三章第三节 抽象数据型(ADT) Creators(构造器): 创建某个类型的新对象,?个创建者可能会接受?个对象作为参数,但是这个对象的类型不能是它创建对象对应的类型.可能实现为构造函数或静态函数.(通常称为工厂方法) t* ->  T 例子:Integer.valueOf( ) Producers(生产器): 通过接受同类型的对象创建新的对象. T+ , t* -> T 例子:String.concat( ) Observers(观察器): 获取抽象类型的对象然后返回一个不同类

软件构造 第一章第二节 软件开发的质量属性

?软件构造 第一章第二节 软件开发的质量属性 1.软件系统质量指标 External quality factors affect users 外部质量因素影响用户 Internal quality factors affect the software itself and its developers 内部质量因素影响软件本身和它的开发者 External quality results from internal quality 外部质量取决于内部质量 外部属性: 正确性:按照预先定义的"