Python 核心编程第3版 课后题2-5
服务器端
# TCP服务器,识别客户端发出的date,os,和ls命令
from socket import *
from time import ctime
import os
import re
HOST = '' # 变量空白,是对bind()方法的标识,表明可以使用任何可用的地址。
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5) # 参数表示在连接被转接或拒绝之前,传入连接请求的最大数
def orderExplain(order):
patt = r'(?<=ls ).*'
if order == 'date':
return ctime()
elif order == 'os':
return os.name
elif re.match('ls', order):
if order == 'ls':
return os.curdir
else:
path = re.findall(patt, order)[0]
return '\n'.join(os.listdir(path)) # 将list转化为字符串
else:
return 'You have input a wrong order...'
while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()
print('...connected from :', addr)
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
result = orderExplain(data.decode())
tcpCliSock.send(result.encode())
tcpCliSock.close()
tcpSerSock.close()
客户端
# 客户端程序,仅允许输入date,os和ls命令
from socket import *
HOST = 'localhost' # 服务器的主机名
PORT = 21567 # 服务器的端口号
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input('> ')
if not data:
break
tcpCliSock.send(data.encode())
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print(data.decode())
tcpCliSock.close()