发送者:
send_file.py
def send_file(filename: str = "mytext.txt", testing: bool = False) -> None:import socketport = 12312 # Reserve a port for your service.sock = socket.socket() # Create a socket objecthost = socket.gethostname() # Get local machine namesock.bind((host, port)) # Bind to the portsock.listen(5) # Now wait for client connection.print("Server listening....")while True:conn, addr = sock.accept() # Establish connection with client.print(f"Got connection from {addr}")data = conn.recv(1024)print(f"Server received: {data }")with open(filename, "rb") as in_file:data = in_file.read(1024)while data:conn.send(data)print(f"Sent {data!r}")data = in_file.read(1024)print("Done sending")conn.close()if testing: # Allow the test to completebreaksock.shutdown(1)sock.close()if __name__ == "__main__":send_file()
启动python文件:
出现:
servering listening
received_file.py
if __name__ == "__main__":import socket # Import socket modulesock = socket.socket() # Create a socket objecthost = socket.gethostname() # Get local machine nameport = 12312sock.connect((host, port))sock.send(b"Hello server!")with open("Received_file", "wb") as out_file:print("File opened")print("Receiving data...")while True:data = sock.recv(1024)print(f"{data }")if not data:breakout_file.write(data) # Write data to a fileprint("Successfully got the file")sock.close()print("Connection closed")
接收者这边也启动received_file:
另外同时send_file也收到:
文件结构如下:
参考:
# 服务器端import socket
import os
import hashlibserver = socket.socket()server.bind(("localhost", 6969)) # 绑定监听端口server.listen(5) # 监听print("监听开始..")while True:conn, addr = server.accept() # 等待连接print("conn:", conn, "\naddr:", addr) # conn连接实例while True:data = conn.recv(1024) # 接收if not data: # 客户端已断开print("客户端断开连接")breakprint("收到的命令:", data.decode("utf-8"))cmd, filename = data.decode("utf-8").split(" ")if cmd =="get":if os.path.isfile(filename): # 判断文件存在# 1.先发送文件大小,让客户端准备接收size = os.stat(filename).st_size #获取文件大小conn.send(str(size).encode("utf-8")) # 发送数据长度print("发送的大小:", size)# 2.发送文件内容conn.recv(1024) # 接收确认m = hashlib.md5()f = open(filename, "rb")for line in f:conn.send(line) # 发送数据m.update(line)f.close()# 3.发送md5值进行校验md5 = m.hexdigest()conn.send(md5.encode("utf-8")) # 发送md5值print("md5:", md5)server.close()
Python编程:socket实现文件传输
# 客户端import socket
import os
import hashlibclient = socket.socket() # 生成socket连接对象ip_port =("localhost", 6969) # 地址和端口号client.connect(ip_port) # 连接print("服务器已连接")while True:content = input(">>")if len(content)==0: continue # 如果传入空字符会阻塞if content.startswith("get"):client.send(content.encode("utf-8")) # 传送和接收都是bytes类型# 1.先接收长度,建议8192server_response = client.recv(1024)file_size = int(server_response.decode("utf-8"))print("接收到的大小:", file_size)# 2.接收文件内容client.send("准备好接收".encode("utf-8")) # 接收确认filename = "new" + content.split(" ")[1]f = open(filename, "wb")received_size = 0m = hashlib.md5()while received_size < file_size:size = 0 # 准确接收数据大小,解决粘包if file_size - received_size > 1024: # 多次接收size = 1024else: # 最后一次接收完毕size = file_size - received_sizedata = client.recv(size) # 多次接收内容,接收大数据data_len = len(data)received_size += data_lenprint("已接收:", int(received_size/file_size*100), "%")m.update(data)f.write(data)f.close()print("实际接收的大小:", received_size) # 解码# 3.md5值校验md5_sever = client.recv(1024).decode("utf-8")md5_client = m.hexdigest()print("服务器发来的md5:", md5_sever)print("接收文件的md5:", md5_client)if md5_sever == md5_client:print("MD5值校验成功")else:print("MD5值校验失败")client.close()