高级编程技巧 学习笔记
一、TCP 文件下载客户端
1.1、程序流程
-
创建套接字 连接服务器
-
要下载的文件名称
-
发送文件下载的请求
-
接收服务端发送过来的数据
-
保存文件
-
关闭套接字
1.2、代码实现
import socket
def main():
# 创建TCP套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
server_ip = input("server ip:")
server_port = int(input("server port:"))
tcp_client_socket.connect((server_ip , server_port))
# 为了方便测试, 可以固定
# tcp_client_socket.connect(('192.168.0.105', 7890))
# 发送文件下载请求
file_name = input('请输入文件名称:')
tcp_client_socket.send(file_name.encode('gbk'))
# 接收文件
recv_data = tcp_client_socket.recv(1024*1024)
if recv_data:
# 保存文件
with open('接收'+file_name, 'wb') as f:
f.write(recv_data)
recv_data = tcp_client_socket.recv(1024)
print(recv_data.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()
if __name__ == '__main__':
main()
二、TCP 文件下载服务器
2.1、程序流程
-
创建套接字
-
绑定信息
-
listen 主动变被动
-
accept 等待客户端的链接
-
发送/接收
2.2、代码实现
import socket
def send_file_client(new_client_socket):
# 接收客户端发送过来的数据(文件名)
file_name = new_client_socket.recv(1024).decode()
# 给个默认值, 防止文件不存在时报错, b 转为字节符
content = b""
try:
with open(file_name, 'rb') as f:
content = f.read()
print("Down %s Final!" % file_name)
# 文件不存在
except:
print("no download file:%s" % file_name)
# 发送数据
new_client_socket.send(content)
new_client_socket.send("下载完成!".encode('gbk'))
new_client_socket.close()
def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.bind(("", 7890))
tcp_server_socket.listen(128)
new_client_socket, client_addr = tcp_server_socket.accept()
# 给客户端返回文件内容
send_file_client(new_client_socket)
tcp_server_socket.close()
if __name__ == '__main__':
main()