这个案例主要分为两部分:客户端和服务器。主要步骤:
- 开启服务器,开启后套接字(被动的,用于接受客户端请求的)处于堵塞状态(因为没有可接受的数据)
- 开启客户端,发送下载请求
- 服务器的套接字接受请求,为其分配一个新套接字(专门为服务器服务的)
- 服务器开始给客户端传输数据
- 对于当前客户端的服务已完成,开始为下一个客户端服务
客户端:
import socket
def main():
# 1.创建套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.获取服务器的ip和port
dest_ip = '192.168.78.1'
dest_port = 7788
# 3.连接服务器
tcp_client_socket.connect((dest_ip,dest_port))
# 4.获取下载的文件名字
download_file_name = input("请输入要下载的文件名字:")
# 5.将文件名字发送到服务器
tcp_client_socket.send(download_file_name.encode("gbk")) # 在windows下使用gbk解码,在Linux下用utf-8
# 6.接受文件中的数据
recv_data = tcp_client_socket.recv(1024) # 每次接受的数据大小,此处为1KB
if recv_data: # 如果没有找到下载的文件,那么就会关闭服务器连接,之后会返回recv_data一个空值(默认不会传数据为空)
# 7.保存接收到的数据到一个文件中
with open("[新]"+download_file_name,"wb") as f: # 接受数据本来就是需要使用byte类型接收的,所以之前在接收那一步就没有将数据解码,这里直接使用rb
f.write(recv_data)
# 8.关闭套接字
tcp_client_socket.close()
if __name__ =="__main__":
main()
服务器
import socket
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.绑定本地信息 bind 由于是服务器不能总变端口号,所以需要绑定
tcp_server_socket.bind(("",7788))
# 3.让默认套接字由主动变被动 listen
tcp_server_socket.listen(128) #128可以理解为承载客户端的能力
while True:
print("等待一个新的客户端的到来...")
# 4.等待客户端连接 accept
new_client_socket,client_addr = tcp_server_socket.accept()
print("一个新的客户已经到来%s" % str(client_addr))
# 5.接受客户端发来的请求
recv_data = new_client_socket.recv(1024)
print("客户端发送过来的请求是: %s" % recv_data.decode("gbk"))
# 6.回复客户端数据
new_client_socket.send("downloading...".encode("gbk"))
# 7.关闭套接字
#关闭accept返回的套接字 意味着 不会再为这个客户端服务
new_client_socket.close()
# 如果将监听的套接字关闭,那么就会导致不能再次等待新用户的到来
tcp_server_socket.close()
print("服务完毕")
if __name__ == "__main__":
main()