服务端
# -*- coding=utf-8 -*-import socketimport threadingimport sysimport osimport structdefdeal_data(conn, addr):print('Accept new connection from {0}'.format(addr))whileTrue:
fileinfo_size= struct.calcsize('128sl')# linux 和 windows 互传 128sl 改为 128sq 机器位数不一样,一个32位一个64位
buf= conn.recv(fileinfo_size)print('收到的字节流:', buf,type(buf))if buf:print(buf,type(buf))
filename, filesize= struct.unpack('128sl', buf)
fn= filename.strip(str.encode('\00'))
new_filename= os.path.join(str.encode('./'),str.encode('new_')+ fn)print('file new name is {0}, filesize if {1}'.format(new_filename, filesize))
recvd_size=0# 定义已接收文件的大小withopen(new_filename,'wb')as fp:print("start receiving...")whilenot recvd_size== filesize:if filesize- recvd_size>1024:
data= conn.recv(1024)
recvd_size+=len(data)else:
data= conn.recv(filesize- recvd_size)
recvd_size= filesize
fp.write(data)print("end receive...")
conn.close()breakdefsocket_service():try:
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
s.bind(('',12345))# 这里换上自己的ip和端口
s.listen(10)except socket.erroras msg:print(msg)
sys.exit(1)print("Waiting...")whileTrue:
conn, addr= s.accept()
t= threading.Thread(target=deal_data, args=(conn, addr))
t.start()if __name__=='__main__':
socket_service()
客户端
# -*- coding=utf-8 -*-import socketimport osimport sysimport structdefsocket_client():try:
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.66',12345))except socket.erroras msg:print(msg)
sys.exit(1)whileTrue:
filepath=input("please input file path: ")if os.path.isfile(filepath):# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size= struct.calcsize('128sl')# 定义文件头信息,包含文件名和文件大小
fhead= struct.pack('128sl',bytes(os.path.basename(filepath).encode('utf-8')), os.stat(filepath).st_size)
s.send(fhead)print('client filepath: {0}'.format(filepath))withopen(filepath,'rb')as fp:whileTrue:
data= fp.read(1024)ifnot data:print('{0} file send over...'.format(filepath))break
s.send(data)
s.close()breakif __name__=='__main__':
socket_client()