澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

python3基于TCP实现CS架构文件传输

正文实例为我们享用了python3落到实处CS布局文件传输的现实性代码,供大家参考,具体内容如下

本文为大家大饱眼福了python cs布局完结轻松文件的传导代码,供我们参谋,具体内容如下

1、目标:

要兑现简单文件的传导大家不得不考虑那个难点:

依赖tcp完成CS布局的文件传输

1.什么是c/s架构?

命令列表:(1)get:从劳动器端下载文件

看名就能够猜到其意义,就是顾客端端/服务器架设。分裂的人只怕回答不后生可畏,然则有少数是均等的:服务器是三个软件或硬件,用于向三个或三个顾客端提供所须求的服务,服务器存在的举世无双目标正是等待客商的号令,给那些顾客服务,然后等待其他的伸手。

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

2.客商端与服务端怎么着通讯?

                    (3)list:得到劳动器端的目录

实际轻易正是网络中多少个主机该怎么通讯,首先我们用ip地址能够标示大器晚成台主机,那样就可以通讯了么?当然也要命,大家还得标示主机中的进程,当然公约也是须要的,是udp报中华全国文艺界抗敌组织议也许tcp数据流左券,这的看您个人的须求。用套介子来作为二个标示符,唯生机勃勃标记网络进程。

2、socket模块函数:

想通晓那四个问题本身认为那些标题有七分之后生可畏风度翩翩度缓慢解决了,接下去呢笔者选拔tcp公约来传输。

(1)send和sendall:send的效用是出殡和安葬TCP数据,再次回到发送的数额大小。send函数不保险将有着数据总体出殡和下葬,因而恐怕要求再次多次技能日试万言全数数据的出殡。sendall的功用是殡葬完整的TCP数据,成功时回来None,退步时抛出十二分

服务端:

(2)bind:在劳动器端使用,用于将socket绑定在二个一定的ip地址和端口上。在《UNIX互联网编制程序》大器晚成书中涉及,假诺调用connect或许listen从前并未有bind二个一定的端口,内核会为对应的套接字分配贰个即兴的端口。因而,在顾客端调用connect函数以前不须求bind

        采用socket()函数 定义socket描述字

(3)listen:通过参数设定服务器端最多能够承当多少个客商端的连年,但是独有在成就与第三个顾客端的传递后才交易会开与第四个顾客端的传递

        bind(卡塔尔国函数来把地址族中一个一定地点赋给socket,简单的讲便是把三个ipv4/ipv6地址+端口号组合赋给socket

3、代码:

澳门在线游戏平台网,        listen(卡塔尔国函数把socket产生被动类型的,等待顾客连接伏乞。

(1)服务器端:

        当客户端发来信息时用accept(State of Qatar函数来经受乞求,同不日常间给服务端重临想客端的socket描述字,接下去服务端以吸纳到的描述字来向顾客端发送音讯以至接受音讯。

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 

澳门云顶集团娱乐中心,        大家这么些程序是促成文件传输,笔者的主见是临近于ftp程序接纳客商上传下载文件的须求。服务端运转后监听端口(小编用的9500)等待客商连接。客商端二次握手建设布局连接后,顾客输入指令来向顾客端发起号令,输入‘ls'命令能够查看服务端可下载的文件,输入‘put   文件名',‘get  文件名'能够上传下载文件。上传文件时客商端展开当三步跳件以二进制情势读取文件内容并还要调用send(卡塔尔函数发送文书内容,服务端以写方式张开文件并将顾客端上传内容写入文件,完毕公文的上传。下载文件与此相同,顾客端上传递‘get  文件名'命令同一时候以写方式张开文件 ,服务端收到命令以读格局张开文件,并发送给服务端。

(2)客户端:

tcp一次握手创设连接:

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

澳门在线游戏平台网 1

上述正是本文的全体内容,希望对大家的求学抱有助于,也盼望大家不吝指教脚本之家。

当客商端调用connect时,触发了连年需要,向服务器发送了SYN J包,那时connect步入梗塞状态;服务器监听到连年伏乞,即接受SYN J包,调用accept函 数选择哀告向客商端发送SYN K ,ACK J+1,此时accept步向堵塞状态;顾客端收到服务器的SYN K ,ACK J+1之后,那个时候connect重回,并对SYN K举办确认;服务器收到ACK K+1时,accept再次回到,至此二遍握手实现,连接创立。

本文由澳门网络娱乐游戏平台发布于编程,转载请注明出处:python3基于TCP实现CS架构文件传输

相关阅读