socketserver服务端
import socketserver, hashlib, os
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
#打印客户端地址
print("{} wrote:".format(self.client_address))
while True:
self.data = self.request.recv(1024).decode("utf-8", "ignore")
cmd, filename = self.data.split()
if cmd == "get":
if os.path.isfile(filename):
file_size = os.stat(filename).st_size
self.request.send(str(file_size).encode())
#接收客户端大小确认信息
size_ack = self.request.recv(1024).decode("utf-8", "ignore")
#打印数据大小确认,开始发送数据
print(size_ack)
f = open(filename, "rb")
m = hashlib.md5()
for line in f:
m.update(line)
self.request.send(line)
self.request.send(m.hexdigest().encode())
print("send done!")
f.close()
elif cmd == "put":
self.request.send("服务端正在请求文件大小信息...".encode())
file_size = self.request.recv(1024).decode("utf-8", "ignore")
self.request.send("上传文件大小为{}".format(file_size).encode())
f = open(filename+".put", "wb")
m = hashlib.md5()
recv_size = 0
recv_data = b""
while recv_size < int(file_size):
if int(file_size) - recv_size > 1024:
size = 1024
else:
size = int(file_size) - recv_size
recv_data = self.request.recv(size)
f.write(recv_data)
m.update(recv_data)
recv_size += len(recv_data)
else:
recv_md5 = self.request.recv(1024).decode("utf-8", "ignore")
print("before:", recv_md5)
print("after:", m.hexdigest())
print("recvieved done!")
f.close()
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
#执行自己创建的请求处理类
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
#处理多个请求,永远执行
server.serve_forever()
socketserver客户端1
#ftp 客户端
import socket, hashlib, os
client = socket.socket()
client.connect(("localhost", 9999))
while True:
data = input(">>:").strip()
if not data:continue
filename = data.split()[1]
client.send(data.encode())
if data.startswith("get"):
#接收文件大小信息
file_total_size = client.recv(1024).decode("utf-8", "ignore")
#发送文件大小接收确认
client.send("客户端已得知文件大小为{0}".format(file_total_size).encode())
f = open(filename+".get", "wb")
m = hashlib.md5()
recv_size = 0
recv_data = b""
while recv_size < int(file_total_size):
#此处为了防止MD5和最后一次发送的数据粘包
if int(file_total_size) - recv_size > 1024:
size = 1024
else:
#计算出最后一次剩余的数据大小,只接收此大小的数据
size = int(file_total_size) - recv_size
recv_data = client.recv(size)
f.write(recv_data)
m.update(recv_data)
recv_size += len(recv_data)
print("{0}/{1}".format(str(recv_size), file_total_size))
else:
print("数据已经接受完。")
print("开始验证md5")
print("client md5:", m.hexdigest())
f.close()
print("server md5:", client.recv(1024).decode("utf-8", "ignore"))
elif data.startswith("put"):
if os.path.isfile(filename):
file_total_size = os.stat(filename).st_size
file_size_request = client.recv(1024).decode("utf-8", "ignore")
print(file_size_request)
#发送数据大小到服务端
client.send(str(file_total_size).encode())
#服务器已经接收到文件大小信息,可以开始传送
print(client.recv(1024).decode("utf-8", "ignore"))
f = open(filename, "rb")
m = hashlib.md5()
for line in f:
client.send(line)
m.update(line)
client.send(m.hexdigest().encode())
print("upload done!")
f.close()
else:
pass
client.close()
socketserver客户端2
#ftp 客户端
import socket, hashlib, os
client = socket.socket()
client.connect(("localhost", 9999))
while True:
data = input(">>:").strip()
if not data:continue
filename = data.split()[1]
client.send(data.encode())
if data.startswith("get"):
#接收文件大小信息
file_total_size = client.recv(1024).decode("utf-8", "ignore")
#发送文件大小接收确认
client.send("客户端已得知文件大小为{0}".format(file_total_size).encode())
f = open(filename+".get", "wb")
m = hashlib.md5()
recv_size = 0
recv_data = b""
while recv_size < int(file_total_size):
#此处为了防止MD5和最后一次发送的数据粘包
if int(file_total_size) - recv_size > 1024:
size = 1024
else:
#计算出最后一次剩余的数据大小,只接收此大小的数据
size = int(file_total_size) - recv_size
recv_data = client.recv(size)
f.write(recv_data)
m.update(recv_data)
recv_size += len(recv_data)
print("{0}/{1}".format(str(recv_size), file_total_size))
else:
print("数据已经接受完。")
print("开始验证md5")
print("client md5:", m.hexdigest())
f.close()
print("server md5:", client.recv(1024).decode("utf-8", "ignore"))
elif data.startswith("put"):
if os.path.isfile(filename):
file_total_size = os.stat(filename).st_size
file_size_request = client.recv(1024).decode("utf-8", "ignore")
print(file_size_request)
#发送数据大小到服务端
client.send(str(file_total_size).encode())
#服务器已经接收到文件大小信息,可以开始传送
print(client.recv(1024).decode("utf-8", "ignore"))
f = open(filename, "rb")
m = hashlib.md5()
for line in f:
client.send(line)
m.update(line)
client.send(m.hexdigest().encode())
print("upload done!")
f.close()
else:
pass
client.close()