python3 implements CS architecture file transfer based on TCP
- 2020-11-20 06:09:42
- OfStack
The example of this paper shares the specific code of python3 to realize CS architecture file transfer for your reference. The specific content is as follows
1. Objectives:
CS architecture based on tcp file transfer
Instruction list: (1) get: Download files from the server side
(2) put: Upload files to the server side
(3) list: Get the directory on the server side
2. socket module function:
(1) send and sendall: The role of send is to send TCP data and return the sent data size. The send function does not guarantee that all data will be sent, so it may need to be repeated multiple times to complete the sending of all data. The purpose of sendall is to send complete TCP data, return None on success, and throw an exception on failure
(2) bind: Used on the server side to bind socket to a specific ip address and port. As mentioned in UNIX Network Programming 1, if there is no specific port for bind1 before calling connect or listen, the kernel assigns a random port for the corresponding socket. Therefore, bind is not required before the client calls the connect function
(3) listen: The server side can accept up to several client connections through parameter setting, but the transfer with the second client will only take place after the transfer with the first client is completed
3. Code:
(1) Server side:
import socket
import os
import sys
import time
Host = '127.0.0.1'
Port = 12000
Addr = (Host, Port)
sockListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockListener.bind(Addr)
sockListener.listen(5)
def recvfile(cliSocket):
print('start reveiving file...')
msg = 'no problem'
msg_utf8 = msg.encode(encoding="utf-8")
cliSocket.send(msg_utf8)
filename_utf8 = clientSocket.recv(4096)
filename = filename_utf8.decode()
f = open(filename, 'wb')
while True:
data_utf8 = cliSocket.recv(4096)
data = data_utf8.decode()
if data=='EOF':
print('received file successfully')
break
f.write(data_utf8)
f.close()
def sendfile(cliSocket):
print('start sending file...')
msg = 'no problem'
msg_utf8 = msg.encode(encoding="utf-8")
cliSocket.send(msg_utf8)
filename_utf8 = cliSocket.recv(4096)
filename = filename_utf8.decode()
f = open(filename, 'rb')
while True:
data = f.read(4096)
if not data:
break
cliSocket.sendall(data)
f.close()
time.sleep(1)
msg = 'EOF'
msg_utf8 = msg.encode(encoding="utf-8")
cliSocket.sendall(msg_utf8)
print('sent file successfully')
def getList(cliSocket):
path = sys.path[0]
every_file = os.listdir(path)
for filename in every_file:
pathmsg = filename + '\n'
pathmsg_utf8 = pathmsg.encode(encoding="utf-8")
cliSocket.sendall(pathmsg_utf8)
time.sleep(1)
msg = 'EOF'
msg_utf8 = msg.encode(encoding="utf-8")
cliSocket.sendall(msg_utf8)
print('all filenames have been send')
while True:
print('waiting for connection...')
clientSocket, addr = sockListener.accept()
print('... connection from:', addr)
while True:
msg_utf8 = clientSocket.recv(4096)
msg = msg_utf8.decode()
if msg=='exit':
print(addr, 'close the connection')
break
elif msg=='get':
sendfile(clientSocket)
elif msg=='put':
recvfile(clientSocket)
elif msg=='list':
getList(clientSocket)
else:
print('client error!')
break
(2) Client:
import socket
import time
Host = '127.0.0.1'
Port = 12000
Addr = (Host, Port)
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket.connect(Addr)
def recvfile(filename):
print('start receiving file...')
f = open(filename, 'wb')
filename_utf8 = filename.encode(encoding="utf-8")
clientSocket.sendall(filename_utf8)
while True:
data_utf8 = clientSocket.recv(4096)
data=data_utf8.decode()
if data=='EOF':
print('receive file successfully')
break
f.write(data_utf8)
f.close()
def sendfile(filename):
print('start sending file...')
f = open(filename, 'rb')
filename_utf8 = filename.encode(encoding="utf-8")
clientSocket.sendall(filename_utf8)
while True:
data = f.read(4096)
if not data:
break
clientSocket.sendall(data)
f.close()
time.sleep(1)
endmsg = 'EOF'
endmsg_utf8 = endmsg.encode(encoding="utf-8")
clientSocket.sendall(endmsg_utf8)
print('send file successfully')
def confirm(confirm_command):
confirm_command_utf8 = confirm_command.encode(encoding="utf-8")
clientSocket.sendall(confirm_command_utf8)
msg_utf8 = clientSocket.recv(4096)
msg = msg_utf8.decode()
print('reveive message:', msg)
if msg=='no problem':
return True
else:
return False
def operation1(filename):
if confirm('get'):
recvfile(filename)
else:
print('serve error!')
def operation2(filename):
if confirm('put'):
sendfile(filename)
else:
print('serve error!')
def operation3(act):
if act=='list':
act_utf8 = act.encode(encoding="utf-8")
clientSocket.sendall(act_utf8)
while True:
msg_utf8 = clientSocket.recv(1024)
msg = msg_utf8.decode()
if msg=='EOF':
break
print(msg)
else:
print('wrong command!')
try:
while True:
command = input('>>>')
if not command:
continue
elif command=='exit':
command_utf8 = command.encode(encoding="utf-8")
clientSocket.sendall(command_utf8)
print('the connection is closed')
break
msg = command.split()
if len(msg)==2 and msg[0]=='get':
operation1(msg[1])
elif len(msg)==2 and msg[0]=='put':
operation2(msg[1])
elif len(msg)==1:
operation3(msg[0])
else:
print('wrong command!')
except socket.error as e:
print('error:', e)
print('an error causes the connection to close!')
clientSocket.close()