《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 = 9999
    BUFSIZ = 1024
    HOST, PORT = get_addr()

    if not HOST:
        HOST = defaultHOST

    if not PORT:
        PORT = defaultPORT
    else:
        try:
            PORT = int(PORT)
        except:
            PORT = defaultPORT

    ADDR = (HOST, PORT)

    tcpcliSock = socket(AF_INET, SOCK_STREAM)
    try:
        tcpcliSock.connect(ADDR)
        while True:
            data = input('>')
            if not data:
                break
            tcpcliSock.send(data.encode('utf-8'))
            msg = tcpcliSock.recv(BUFSIZ)
            if not msg:
                break
            else:
                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 = 9999
    BUFSIZ = 1024

    HOST, PORT = get_addr()
    if not HOST:
        HOST = defaultHOST
    if not PORT:
        PORT = defaltPORT
    else:
        try:
            PORT = int(PORT)
        except:
            PORT = defaltPORT
    ADDR = (HOST, PORT)

    udpcliSock = socket(AF_INET, SOCK_DGRAM)
    udpcliSock.settimeout(2)    # 设置超时

    while True:
        data = input('>')
        if not data:
            break
        try:
            udpcliSock.sendto(data.encode('utf-8'), ADDR)
            msg, ADDR = udpcliSock.recvfrom(BUFSIZ)
            if not msg:
                break
            print(msg.decode('utf-8'))
        except:
            print('发送失败')
            break
            
    print('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 re

def 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' + file
    return msg

def 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' + file
    return msg


def main():
    HOST = ''
    PORT = 9999
    ADDR = (HOST, PORT)
    BUFSIZ = 1024

    tcpserSock = 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:
                    break
                data = 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:
                break

        tcpcliSock.close()


main()

客户端代码请见文章《Python 网络编程》https://blog.csdn.net/dannier5/article/details/121920645

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值