Python核心编程(第三版)第二章课后习题解答(部分)

由于本人初入python高级编程,在技术方面能力还有所欠缺,目前只完成部分习题。以下代码均为本人原创,如有错误,欢迎指出,感激不尽!

#2-1
**面向连接的套接字:**在客户端向服务器发出请求之前,必须先得建立一条客户端到服务器的连接,数据传输过程中可保证数据传输大的可靠性和顺序性
**无连接的套接字:**在客户端向服务器发出请求之前,不需要建立一条从客户端到服务器的连接,但是不能保证数据传输的可靠性和顺序性

#2-2
**客户端服务器架构:**客户端有请求的时候,向服务器发出请求;服务器接收到客户端的请求后,处理请求并将结果返回给客户端
1、银行柜台:去银行办理业务的客户相当于客户端,银行柜台工作人员相当于服务器。客户提出办理业务请求,工作人员处理请求并在处理之后返回给客户相关信息
2、食堂打饭:学生相当于客户端,打饭人员相当于服务器;学生向打饭人员提出想吃什么菜,打饭人员接收到消息之后,打包好相应的饭菜递交给学生

#2-3
TCP

#2-4

#tsTclnt.py TCP时间戳客户端
'''
这个脚本创建一个TCP客户端,它提示用户输入发送到服务器端的消息,并接受从服务器端返回的
添加了时间戳前缀的相同消息,然后将结果展示给用户
'''
from socket import *

'''HOST = 'localhost'#or '127.0.0.1'如果服务器运行在另一台主机上,那么需要进行相应的修改
PORT = 21567#应该和服务器设置的完全相同'''

def getADDR():
    HOST = input('Please input the host name...')
    PORT = input('Please input the port...')
    if HOST == '' or PORT == '':
        HOST = 'localhost'
        PORT = 21567
    ADDR = (HOST, int(PORT))
    return ADDR

BUFSIZ = 1024
ADDR = getADDR()

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data = input('> ')
    if not data:
        break
    tcpCliSock.send(bytes(data, 'utf-8'))
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))
tcpCliSock.close()

#2-5

**#服务器**
import socket

HOST = ''
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    while True:
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                conn.sendall(data)
            conn.close()
    s.close()
    
    
**#客户端**
import socket

HOST = 'localhost'
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello world')
    data = s.recv(1024)
print('Received ', repr(data))

#2-5 扩展 实现了 ls dir 命令

**#服务器**
import socket
import os
from time import ctime
import re

HOST = ''
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    while True:
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024).decode('utf-8')
                patt = r'^ls\s?(.*)'
                m = re.match(patt, data)
                if not data:
                    break
                if m:
                    if m.group(1):
                        path = str(m.group(1))
                    else:
                        path = os.curdir
                    recon = str(os.listdir(path))
                else:
                    if data == 'date':
                        recon = ctime()
                    elif data == 'os':
                        recon = os.name

                conn.sendall(bytes(recon, 'utf-8'))
            conn.close()
    s.close()
    
**#客户端**
import socket

HOST = 'localhost'
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    while True:
        data = input('>')
        if not data:
            break
        s.sendall(bytes(data, 'utf-8'))
        data = s.recv(1024)
        print('Received ', data.decode('utf-8'))

#2-6
#获取UDP协议daytime服务的端口号
‘’’
getservbyname函数传入两个参数,第一个参数位服务名,第二个参数位协议名称
‘’’
import socket
socket.getservbyname(‘daytime’,‘UDP’)

#2-7

半双工聊天
**#服务器**
from socket import *

#先确定好主机和端口号
HOST = ''
PORT = 21567

ADDR = (HOST, PORT)

#建立tcp套接字
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)#套接字绑定地址
tcpSerSock.listen(5)#开始监听是否有请求

while True:
    print('...waiting connection...')
    cliSerSock, addr = tcpSerSock.accept()#接受来自客户端的请求,并返回一个新的套接字和客户端的地址
    print('connect from: ', addr)

    while True:
        rec = cliSerSock.recv(1024).decode('utf-8')#接受来自客户端的消息
        if rec == 'quit':
            print('This chat ends...')
            break
        else:
            print('>', rec)
            rep = input('>')
            cliSerSock.send(bytes(rep, 'utf-8'))
    cliSerSock.close()
tcpSerSock.close()

**#客户端**
from socket import *

HOST = 'localhost'#or '127.0.0.1'如果服务器运行在另一台主机上,那么需要进行相应的修改
PORT = 21567#应该和服务器设置的完全相同
ADDR = (HOST, PORT)

tcpClntSock = socket(AF_INET, SOCK_STREAM)
tcpClntSock.connect(ADDR)


flag = 0
while True:
    if flag == 0:
        print('Now let\'s begin chatting!')
        send = input('>')
        tcpClntSock.send(bytes(send, 'utf-8'))
        flag = 1
    if send == 'quit':
        print('This chat ends...')
        break
    else:
        rec = tcpClntSock.recv(1024).decode('utf-8')
        print('>', rec)
        send = input('>')
        tcpClntSock.send(bytes(send, 'utf-8'))

tcpClntSock.close()

#2-8、2-9、2-10由于目前别人还没有学多线程实现,因此暂时搁置

#2-11

from socket import *
HOST = 'www.sina.com'
PORT = 80
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
tcpCliSock.send(bytes('GET/ \n', 'utf-8'))
data = tcpCliSock.recv(BUFSIZ).decode('utf-8')
with open(r"D:\webpage.txt",'w') as f:
    f.write(data)
print('operating successfully!')

未完待续~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值