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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python3可以使用socket模块实现基于TCP协议的客户/服务器的网络文件传输程序。下面是一个简单的示例: 服务器端程序: ``` import socket def server(): # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP和端口 server_ip = '127.0.0.1' server_port = 8888 server_socket.bind((server_ip, server_port)) # 开启监听 server_socket.listen(5) print('服务器已启动,等待连接...') while True: # 接受客户端连接请求 client_socket, client_address = server_socket.accept() print('客户端已连接:', client_address) # 接收文件名 file_name = client_socket.recv(1024).decode() print('接收到的文件名:', file_name) # 打开文件并读取内容 try: with open(file_name, 'rb') as file: data = file.read() client_socket.sendall(data) print('文件传输成功') except FileNotFoundError: client_socket.sendall(b'file not found') print('文件不存在') # 关闭连接 client_socket.close() if __name__ == '__main__': server() ``` 客户端程序: ``` import socket def client(): # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_ip = '127.0.0.1' server_port = 8888 client_socket.connect((server_ip, server_port)) # 发送文件名 file_name = 'test.txt' client_socket.send(file_name.encode()) # 接收文件内容 data = client_socket.recv(4096) if data == b'file not found': print('文件不存在') else: # 将文件内容写入本地文件 with open('received_file.txt', 'wb') as file: file.write(data) print('文件传输成功') # 关闭连接 client_socket.close() if __name__ == '__main__': client() ``` 以上程序实现了一个简单的基于TCP协议的网络文件传输程序。服务器端监听客户端连接请求,接收客户端发送的文件名,根据文件名读取文件内容并发送给客户端。客户端连接服务器后发送文件名,接收服务器发送的文件内容,并将文件内容写入本地文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值