原版:
TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务。
改良版:
TCP分为客户端(client)和服务器(server),
(1)每次服务器能为客服端循环提供下载服务,
(2)服务器能够识别出不存在的文件并且发送客户端,
(3)客户端能够通过输入退出下载服务,并且服务器能够退出为当前客户端的服务,等待为下一个客户端的服务。
难点:
(1)处理不存在的文件,引入了continue关键字,若不引入,当下载遇到不存在的文件,之前存储上一个文件数据的变量会作为数据发送给客户端!!
(2)客户端和服务器退出当前服务,引入了break关键字。
自学自练,欢迎指正。
代码语言:javascript复制 1 # 客户端
2 import socket
3
4 def main():
5
6 # 1,创建套接字
7
8 tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
9
10
11 # 2,链接服务器
12 server_ip = input('获取服务器的IP:')
13 server_port = int(input('获取服务器的端口号:'))
14 tcp_client.connect((server_ip, server_port))
15 print('温馨提示:')
16 print('*'*20)
17 print('如果想要终止下载文件的请求, 请输入“quit”, 退出下载!')
18 while True:
19 # 3,获取要下载的文件名
20 file_name = input('输入要下载的文件名:')
21
22
23
24 # 4,发送文件名到服务器
25 send_data = tcp_client.send(file_name.encode('utf-8'))
26
27 if file_name == 'quit': # 这里if判断语句要放置在send_data之后,让客户端把quit发送到服务器,服务器退出为当前客户端服务,等待为下一个客户端服务。
28 break
29
30 # 5,接收数据
31 recv_data = tcp_client.recv(1024)
32 if recv_data.decode('utf-8') != '101':
33 # print('接收数据:' ,recv_data.decode('utf-8'))
34 with open('C:\Users\Administrator\Desktop\练习生\网络通信\' '[副本]' file_name, 'wb') as f:
35 f.write(recv_data)
36 else:
37 print('文件不存在')
38
39 tcp_client.close()
40
41 if __name__ == '__main__':
42 main()
代码语言:javascript复制 1 import socket
2 def send_2_client(tcp_client, tcp_addr):
3
4 # 循环为一个客户端服务
5 while True:
6 # 1 接收客服端发送的文件名数据或者接收客户端退出下载的请求(quit)
7 recv_data = tcp_client.recv(1024)
8
9 file_name = recv_data.decode('utf-8')
10 print('客户端:%s,请求下载的文件:%s' % (str(tcp_addr),file_name))
11
12 # 退出为当前客服端的下载服务
13 if file_name == 'quit':
14 break
15 # 2 读取文件数据
16
17 try:
18 f = open(file_name, 'rb')
19 send_content = f.read()
20 f.close() #关闭文件,释放内存
21 except:
22 print('文件不存在')
23 tcp_client.send('101'.encode('utf-8'))
24 continue #当下载的文件不存在时,循环重新开始,等待当前客户端发送新的下载请求
25
26 # 3 发送数据
27 tcp_client.send(send_content)
28 tcp_client.close()
29
30
31
32
33
34 def main():
35 # 1,创建服务器套接字
36 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
37
38 # 2,绑定地址信息
39 tcp_server_socket.bind(('', 7788))
40
41 # 3,设置为被动监听
42 tcp_server_socket.listen(128)
43
44 # 4,循环等待客户端的访问
45 # 循环为多个客户端服务
46 while True:
47 print('等待客服端的访问请求...')
48 tcp_client, tcp_addr = tcp_server_socket.accept()
49 send_2_client(tcp_client, tcp_addr)
50 tcp_server_socket.close()
51
52
53
54
55 if __name__ == '__main__':
56 main()