学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


Pysocket

2-1 套接字。面向连接的套接字和无连接套接字之间的区别是什么?

面向连接的套接字 无连接的套接字
在通信之前必须建立连接 在通信之前不需要建立连接
序列化的,可靠的不重复的数据交付 无法保证顺序性,可靠性或重复性,减少以一定的开销
没有记录边界 保存了记录边界
每条信息可以拆分成多个片段,并且每一个消息片段都能确保到达目的地,然后将他么按顺序组合在一起。 消息是以整体发送的。
传输控制协议(TCP) 用户数据协议(UDP)

2-2 客户端/服务器架构。用自己的话描述这个术语的意思,并给出几个例子。 1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。其存在的目的就是等待客户端的请求,并响应他们(提供服务),然后等待更多的请求。

2-3 套接字。 TCP 和 UDP 之中,哪种类型的服务器接受连接,并将它们转换到独立的 套接字进行客户端通信? tcp

2-4 客户端。更新 TCP(tsTclnt.py)和 UDP(tsUclnt.py)客户端,以使得服务器名称 无须硬编码到应用程序中。此外,应该允许用户指定主机名和端口号,且如果二者 中任何一个或者全部参数丢失,那么应该使用默认值。

import sys, argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="pls write host port")
    parser.add_argument("--host", type=str, default='localhost')
    parser.add_argument("--port", type=int, default=8000)
    args = parser.parse_args()
    host = args.host
    port = args.port
    print(args.host, args.port)

2-6 Daytime 服务。使用 socket.getservbyname()来确定使用 UDP 协议的“daytime”服 务的端口号。检查 getservbyname()的文档以获得其准确的使用语法(即 socket. getservbyname._ doc_)。那么,现在编写一个应用程序,使该应用程序能够通过网 络发送一条虚拟消息,然后等待服务器回复。一旦你收到服务器的回复,就将其显 示到屏幕上。

2-7 半双工聊天。创建一个简单的半双工聊天程序。指定半双工,我们的意思就是,当建 立一个连接且服务开始后,只有一个人能打字,而另一个参与者在得到输入消息提示 之前必须等待消息。并且,一旦发送者发送了一条消息,在他能够再次发送消息之前, 必须等待对方回复。其中,一位参与者将在服务器一侧,而另一位在客户端一侧。

2-8 全双工聊天。更新上一个练习的解决方案,修改它以使你的聊天服务现在成为全双 工模式,意味着通信两端都可以发送并接收消息,并且二者相互独立。

2-9 多用户全双工聊天。进一步修改你的解决方案,以使你的聊天服务支持多用户。

2-10 多用户、多房间、全双工聊天。现在让你的聊天服务支持多用户和多房间功能。

2-11 Web 客户端。编写一个 TCP 客户端,使其连接到你最喜欢的网站(删除“http://”和 任何后续信息;只使用主机名)的 80 端口。一旦建立一个连接,就发送 HTTP 命令 字符串 GET / \n,并将服务器返回的所有数据写入一个文件中(GET 命令会检索一个 本文档由Linux公社 www.linuxidc.com 收集整理 72 第 1 部分 通用应用主题 Web 页面, /file 表明要获取的文件, \n 将命令发送到服务器)。检查检索到的文件的内 容。内容是什么?你如何检查能确保所接收到的数据是正确的?(注意:你可能必须 在命令字符串后面插入一个或两个换行符,通常一个就能正常工作)

2-12 睡眠服务器。创建一个睡眠服务器。客户端将请求一段时间之后进入睡眠状态。 服务器将代表客户端发送命令,然后向客户端返回一条表明成功的消息。客户端应 该睡眠或空闲所请求的时间长度。这是一个远程过程调用的简单实现,此过程中一 个客户端的请求会通过网络调用另一台计算机上的命令。

2-13 名称服务器。设计并实现一个名称服务器。该服务器负责维护一个包含主机名-端 口号对的数据库,也许还有对应服务器所提供的服务的字符串描述。针对一个或多 个现有的服务器,注册它们的服务到你的名称服务器中(注意,在这种情况下,这 些服务器是名称服务器的客户端)。 每个启动的客户端都不知道它们所寻找的服务器地址。同样地,对于名称服务器的 客户端来说,这些客户端应该发送一个请求到名称服务器,以指示它们正在寻找什 么类型的服务。作为回复,名称服务器会向该客户端返回一个主机名-端口号对, 然后该客户端就可以连接到适当的服务器来处理它的请求。 选做题: 1)为名称服务器添加缓存流行请求的功能。 2)为你的名称服务器添加日志记录功能,跟踪哪些服务器注册了名称服务器,以 及客户端正在请求哪些服务。 3) 你的名称服务器应该定期通过相应的端口号 ping 已经注册的主机,以确保它们 的服务确实处于开启状态。反复的失败将会导致名称服务器将其从服务列表中划去。 你可以为那些注册了名称服务器的服务器实现真正的服务,或者仅仅使用虚拟服务 器(仅仅应答一个请求)。

2-14 错误检查和优雅的关闭。本章所有的客户端/服务器示例代码都缺乏错误检查功 能。我们并没有处理以下几种场景,例如,用户按Ctrl+C快捷键退出服务器或Ctrl+D 快捷键终止客户端输入,也没有检查其他对 raw_input()的不适当输入或处理网络错 误。因为这个缺陷,经常我们终止一个应用程序时并没有关闭套接字,很可能会导 致丢失数据。本练习中,在示例中选择一对客户端/服务器程序,并添加足够的错 误检查,这样每个应用程序就能正确地关闭,即关闭网络连接。

2-15 异步性和 SocketServer/socketserver。使用 TCP 服务器的示例,并使用其中一个 mix-in 类来支持一个异步服务器。为了测试你的服务器,同时创建并运行多个客户 端,并交叉显示你的服务器满足二者中请求的输出。

2-16 *扩展 SocketServer 类。在 SocketServer TCP 服务器代码中,我们不得不从原始 的基础 TCP 客户端中修改客户端,因为 SocketServer 类没有维护多个请求之间 的连接。 a)继承 TCPServer 和 StreamRequestHandler 类并重新设计服务器,使其能够为每个客户 端维持并使用单个连接(而不是每个请求一个连接)。 b)将前面练习的解决方案集成到( a)部分中的方案中,这样就可以并行为多个客户端 提供服务。

2-17 *异步系统。研究至少 5 个基于 Python 的不同异步系统,可以从 Twisted、 Greenlets、 Tornado、 Diesel、 Concurrence、 Eventlet、 Gevent 等中选择。描述它们是什么,对 它们进行分类,并找到它们之间的相似点和差异性,然后创建一些演示代码示例