失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python网络通信中cs架构_python3基于TCP实现CS架构文件传输

python网络通信中cs架构_python3基于TCP实现CS架构文件传输

时间:2020-06-12 17:22:14

相关推荐

python网络通信中cs架构_python3基于TCP实现CS架构文件传输

本文实例为大家分享了python3实现CS架构文件传输的具体代码,供大家参考,具体内容如下

1、目标:

基于tcp实现CS架构的文件传输

指令列表:(1)get:从服务器端下载文件

(2)put:向服务器端上传文件

(3)list:获得服务器端的目录

2、socket模块函数:

(1)send和sendall:send的作用是发送TCP数据,返回发送的数据大小。send函数不保证将所有数据全部发送,因此可能需要重复多次才能完成所有数据的发送。sendall的作用是发送完整的TCP数据,成功时返回None,失败时抛出异常

(2)bind:在服务器端使用,用于将socket绑定在一个特定的ip地址和端口上。在《UNIX网络编程》一书中提到,如果调用connect或者listen之前没有bind一个特定的端口,内核会为相应的套接字分配一个随机的端口。因此,在客户端调用connect函数之前不需要bind

(3)listen:通过参数设定服务器端最多可以接受几个客户端的连接,但是只有在完成与第一个客户端的传送后才会进行与第二个客户端的传送

3、代码:

(1)服务器端:

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)客户端:

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

如果觉得《python网络通信中cs架构_python3基于TCP实现CS架构文件传输》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。