《python核心编程(第3版)》练习题2-4_2-5-python3
python版本:python3.8
2-4
客户端。更新 TCP(tsTclnt.py)和 UDP(tsUclnt.py)客户端,以使得服务器名称无须硬编码到应用程序中。此外,应该允许用户指定主机名和端口号,且如果二者中任何一个或者全部参数丢失,那么应该使用默认值。
'''
@文件 :homework_2_4_serv.py
@说明 :TCP客户端,运行用户指定主机名和端口号,且如果二者中任何一个或者全部参数丢失,那么应该使用默认值。
@时间 :2021/12/13 17:01:01
@作者 :Dannie
@版本 :
'''
from socket import *def get_addr():HOST = input('Please input HOST:')PORT = input('Please input PORT:')return(HOST, PORT)def main():defaultHOST = 'localhost'defaultPORT = 9999BUFSIZ = 1024HOST, PORT = get_addr()if not HOST:HOST = defaultHOSTif not PORT:PORT = defaultPORTelse:try:PORT = int(PORT)except:PORT = defaultPORTADDR = (HOST, PORT)tcpcliSock = socket(AF_INET, SOCK_STREAM)try:tcpcliSock.connect(ADDR)while True:data = input('>')if not data:breaktcpcliSock.send(data.encode('utf-8'))msg = tcpcliSock.recv(BUFSIZ)if not msg:breakelse:print(msg.decode('utf-8'))except:print('连接失败,请重新尝试')tcpcliSock.close()main()
'''
@文件 :homework_2_4_udpclient.py
@说明 :UDP客户端,运行用户指定主机名和端口号,且如果二者中任何一个或者全部参数丢失,那么应该使用默认值。
@时间 :2021/12/13 17:41:59
@作者 :Dannie
@版本 :
'''
from socket import *def get_addr():HOST = input('Please input HOST:')PORT = input('Please input PORT:')return(HOST, PORT)def main():defaultHOST = 'localhost'defaltPORT = 9999BUFSIZ = 1024HOST, PORT = get_addr()if not HOST:HOST = defaultHOSTif not PORT:PORT = defaltPORTelse:try:PORT = int(PORT)except:PORT = defaltPORTADDR = (HOST, PORT)udpcliSock = socket(AF_INET, SOCK_DGRAM)udpcliSock.settimeout(2) # 设置超时while True:data = input('>')if not data:breaktry:udpcliSock.sendto(data.encode('utf-8'), ADDR)msg, ADDR = udpcliSock.recvfrom(BUFSIZ)if not msg:breakprint(msg.decode('utf-8'))except:print('发送失败')breakprint('Current socket timeout:%s'%udpcliSock.gettimeout())udpcliSock.close()main()
TCP与UDP服务器代码请见文章《Python 网络编程》https://blog.csdn.net/dannier5/article/details/121920645
2-5
网络互连和套接字。实现 Python 库参考文档中关于 socket 模块中的 TCP 客户端/服务器程序示例,并使其能够正常工作。首先运行服务器,然后启动客户端。也可以在 http://docs.python.org/library/socket#example 网址中找到在线源码。如果你觉得示例中服务器的功能太单调,那么可以更新服务器代码,以使它具有更多功能,令其能够识别以下命令。
'''
@文件 :homework_2_5_morefunc.py
@说明 :网络互接和套接字。更新服务器代码,使其具有更多功能,令其能够识别以下命令。data 服务器返回其当前日期/时间戳ls 列出当前目录文件清单ls dir 返回dir目录中的文件清单
@时间 :2021/12/14 11:12:49
@作者 :Dannie
@版本 :
'''from socket import *
from time import ctime
import os
import redef data_ctime(data):msg = ('[%s] %s' % (ctime(), data.decode('utf-8'))).encode('utf-8')return msg'''返回当前目录文件清单'''
def get_current_ls():current_dir = r'./'msg = ''file_list = os.listdir(current_dir)for file in file_list:msg = msg + '\n' + filereturn msgdef get_lsdir(file_dir):file_list = []msg = ''try:file_list = os.listdir(file_dir)except:file_list.append('文件路径错误...') for file in file_list:msg = msg + '\n' + filereturn msgdef main():HOST = ''PORT = 9999ADDR = (HOST, PORT)BUFSIZ = 1024tcpserSock = socket(AF_INET, SOCK_STREAM)tcpserSock.bind(ADDR)tcpserSock.listen(5)while True:print('Waiting for connect...')tcpcliSock, addr = tcpserSock.accept()print('...connected from:',addr)while True:try:data = tcpcliSock.recv(BUFSIZ)if not data:breakdata = data.decode('utf-8')data_re_ls = re.match(r'ls', data)data_re_lsdir = re.match(r'ls dir .\\(.+)\\', data)if data_re_ls or data_re_lsdir:if data_re_ls:msg = get_current_ls().encode('utf-8')if data_re_lsdir:file_dir = re.search(r'(.\\.+)', data).group()msg = get_lsdir(file_dir).encode('utf-8') else:msg = ('[%s] %s' % (ctime(), data)).encode('utf-8')tcpcliSock.send(msg) except:breaktcpcliSock.close()main()
客户端代码请见文章《Python 网络编程》https://blog.csdn.net/dannier5/article/details/121920645
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
