【软件构造】课件精译(二十三)消息传递与图形化用户界面

本文主要是介绍【软件构造】课件精译(二十三)消息传递与图形化用户界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、套接字&网络:在两台计算机间传递信息

套接字&网络
网络中的Client/server模式,采用socket作为抽象
网络通信是并发的,需要考虑线程安全问题
需要设计client和server通讯用的线路协议
socket的一些阻塞操作使代码编写更容易,但有可能造成死锁
客户端/服务器设计模式
客户端发起通信,服务器接收、处理、回复,重复此过程,客户端断开连接。服务器可同时处理多个客户端,客户端也可同时连接多个服务器。
客户机和服务器可在不同的计算机上,也可在一台计算机上
IP地址
网络接口由IP地址标识。 IPv4地址是以4个8位部分写入的32位数字
主机名
主机名是可以转换为IP地址的名称
端口
服务器进程绑定到特定的端口,在该端口上进行侦听。客户端必须知道服务器正在侦听哪个端口号。
当客户端连接到服务器时,该连接还使用客户端网络接口上的端口号(通常从不常用端 口中随机选择)
网络套接字
socket(套接字)是用于发送和/或接收数据的网络连接中的端点(socket本质是API,对TCP/IP协议的封装)
服务器进程使用侦听套接字等待来自远程客户端的连接
连接成功的套接字可以发送和接收来自连接另一端的进程的消息,通过本地和远程计算机的IP地址和端口号区分两端计算机
Java中的TCP网络——java.net
(因为课程不作考核,时间原因这部分剩余内容省略,重点是有关多线程的第二部分

二、通过线程进行消息传递

Message passing模型用于在客户端和服务器端的进程间通过sockets传递消息
在同一进程的线程间通过message passing传递消息,比通过锁定机制共享内存更受欢迎
使用同步队列在线程之间传递消息
Java是如何支持消息传递的
BlockingQueue支持在检索元素时等待队列变为非空,在存储元素时等待队列中的空间变得可用
当使用BlockingQueue进行消息传递时,确保使用put和take方法,而不是add和remove方法
生产者 - 消费者设计模式
多个生产者和消费者共享一个同步的队列,都可对其写入和读取,需要同步安全机制
在这里插入图片描述
两种BlockingQueue的实现
ArrayBlockingQueue:定长队列,队列满时put操作会阻塞
LinkedBlockingQueue:可变长度队列
可以保存任意类型的对象
消息采用不可变类型
避免竞争情况和确保原子操作
银行账户的例子
每台自动提款机和每个帐户都是自己的模块,模块通过相互发送消息进行交互。 传入的消息到达队列。
我们设计了取消余额和取款的消息,并表示每台取款机在取款前检查帐户余额以防止透支:
在这里插入图片描述
但它仍然可以交错来自两台取款机的消息,因此它们都被认为可以安全地从一个只有1美元的账户中提取最后一美元。
我们需要选择一个更好的原子操作:撤回 - 如果充足 - 资金将是一个比退出更好的操作。
通过队列实现消息传递
在这里插入图片描述
Stopping
如何关闭Squarer?
在C/S模式下, 可以关闭socket以停止客户端或者服务器继续侦听消息
如果期望服务器和客户端同时关闭,可以退出进程
一种不推荐的策略:使用特殊的消息提示结束(如0,或者null),但是魔数或者null都不是推荐的方式
在这里插入图片描述
interrupt()
interrupted()检测当前线程是否被中断,如果被中断,返回true,并清除中断标志
在这里插入图片描述
消息传递死锁
采用定长队列可以提升性能
为了创建死锁所需的条件,在检查Squarer的任何回复之前,客户端代码将发出N个请求,以获得从1到N的数字的平方。 这是完整的代码:
在这里插入图片描述
随着N变得越来越大(远远大于100),我们的客户在没有阅读任何回复的情况下提出了许多请求。
如果N大于QUEUE_SIZE,则回复队列将填满未读回复。 然后Squarerblockstrying再将一个回复放入该队列,并停止调用请求队列。 客户端可以继续将更多请求放入请求队列,但最多只能达到该队列的大小。
如果有更多的额外请求超出该队列的要求 - 即,当N大于2×QUEUE_SIZE-时,客户端对requests.put()的调用也会阻塞。
Squarer在等待客户端读取一些回复并释放回复队列上的空间,但客户端正在等待Squarer接受一些请求并释放请求队列上的空间。 死锁。
消息传递的线程安全参数
队列本身是线程安全的数据类型
传送的数据是不可变的
生产者和消费者内部的数据对外部是不可见的,仅通过消息通讯
如果消息是可变的,则要确保同一时刻只有一个线程能够访问
防止死锁的方案
一个方案是系统设计层面确保不会出现死锁
另外一个方案是终止阻塞并抛出异常
总结
相比通过锁进行同步,消息传递同步是依靠消息通道进行共享
通过阻塞队列的方式是单进程内部线程间通信的有用方式

三、图形用户界面 (GUI)

(因为课程不作考核,时间原因这部分省略

这篇关于【软件构造】课件精译(二十三)消息传递与图形化用户界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763713

相关文章

电子盖章怎么做_电子盖章软件

使用e-章宝(易友EU3000智能盖章软件)进行电子盖章的步骤如下: 一、准备阶段 软件获取: 访问e-章宝(易友EU3000智能盖章软件)的官方网站或相关渠道,下载并安装软件。账户注册与登录: 首次使用需注册账户,并根据指引完成注册流程。注册完成后,使用用户名和密码登录软件。 二、电子盖章操作 文档导入: 在e-章宝软件中,点击“添加”按钮,导入待盖章的PDF文件。支持批量导入多个文件,

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

小红书商家电话采集软件使用指南

使用小红书商家电话采集软件可以提高商家电话的采集效率,以下是使用指南及附带代码。 步骤一:安装Python和相关库 首先,确保你的电脑已经安装了Python运行环境(建议安装Python3版本)。安装完成后,同样需要安装一些相关的库,如requests、beautifulsoup4等。在命令行窗口中输入以下命令进行安装: pip install requestspip install bea

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

服务器监控:运维行业的核心保障与第三方监控软件的选择

随着信息技术的飞速发展,企业IT架构日益复杂,服务器作为整个IT系统的核心,其稳定性和性能对业务的连续性至关重要。在运维行业中,服务器监控作为保障服务器稳定运行的关键环节,已经受到了越来越多企业的重视。本文将探讨服务器监控的重要性、挑战以及选择第三方监控软件的原因,并推荐一款优秀的服务器监控软件——监控易。 一、服务器监控的重要性     服务器监控是指对服务器硬件、操作系统、应用程序

docx转doc工具(软件)

word中的docx转成doc格式软件下载: http://pan.baidu.com/s/1ntsi0yt <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize

python3GUI--ktv点歌软件By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.启动2.搜索2.服务1.首页2.天气预报3.酒水饮料4.酒水饮料2 3.服务4.灯光5.调音6.排行榜7.分类点歌9.歌手点歌10.歌手个人页 三.心得体会1.关于代码2.关于设计3.关于打包 四.总结 文件大小:33.13M https://wwt.lanzoul.com/iikRv22iqmpg 如果安装后打不开,多半是权限问题,请使用管理

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

Inpaint软件最新版下载【安装详细图文教程】

​根据使用者情况表明在今天的数字时代,我们经常会遇到需要处理图形的情况,然而,当我们遇到水印在图形上,我们就需要寻找一个有效的方式来去除它,Inpaint软件就是一个非常实用的工具,它能够帮助我们去除水印、修复照片、删除不需要的元素等等。不得不承认快速去水印:想要用图形素材剪辑视频,结果发现图形素材遍布各种水印,影响视频的展现效果?网上冲浪,遇到喜欢的图形,总是有一层厚厚的水印,影响整体的美观?用