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
|