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)

相关推荐

  • Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之TCP客户端/服务端功能.分享给大家供大家参考,具体如下: demo.py(TCP客户端): import socket def main(): # 1. 创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect(("192.168.33.11", 7890)) server_ip = input(

  • Python3使用TCP编写一个简易的文件下载器功能

    利用Python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱.下面代码就是模拟客户端通过命令行操作服务器.客户端输入命令,服务器执行并且返回结果. TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. 使用TCP编写一个简易的文件下载器要求:需编写文件下载器服务端和文件下载器客户

  • python3.5基于TCP实现文件传输

    本文实例为大家分享了python3.5基于TCP实现文件传输的具体代码,供大家参考,具体内容如下 服务器代码 # _*_ coding:utf-8 _*_ from socket import * import _thread def tcplink(skt,addr): print(skt) print(addr,"已经连接上...") print('开始发送文件') with open('./ww.jpg', 'rb') as f: for data in f: print(dat

  • 对python中基于tcp协议的通信(数据传输)实例讲解

    阅读目录 tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务

  • python3利用tcp实现文件夹远程传输

    本文实例为大家分享了python实现文件夹远程传输的具体代码,供大家参考,具体内容如下 实现功能: 通过tcp协议模拟文件夹的下载,注意是文件夹,不是文件. 下面让我们实现以下: 其中有部分功能还未实现有兴趣的可以将代码自行补全 服务器端代码: import os import socket import time # 定义全局列表用来存储子文件夹 list1 = [] def deal_file(files,dir_name,dir_socket): # 如果打开文件时报错即files为文件夹

  • python基于socket实现的UDP及TCP通讯功能示例

    本文实例讲述了python基于socket实现的UDP及TCP通讯功能.分享给大家供大家参考,具体如下: Server: import socket address = ('127.0.0.1', 31500) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(address) while True: data, addr = s.recvfrom(2048) if not data: print "client has ex

  • Python网络编程之使用TCP方式传输文件操作示例

    本文实例讲述了Python网络编程之使用TCP方式传输文件操作.分享给大家供大家参考,具体如下: TCP文件下载器 客户端 需求:输入要下载的文件名,从服务器端将文件拷贝到本地 步骤: 1.创建TCP套接字,绑定端口 2.连接服务端 3.输入要下载的文件名 4.将文件名编码,并发送到服务端 5.接收服务端返回的数据 6.关闭套接字 代码 # 导入模块 import socket # 创建套接字 tcp_client_socket = socket.socket(socket.AF_INET, s

  • python使用tcp实现局域网内文件传输

    本文为大家分享了python使用tcp实现局域网内文件传输的具体代码,供大家参考,具体内容如下 功能: 可以利用python创建的TCP客户端从我们自己搭建的TCP服务器上下载文件. 实现需求: 安装socket模块 简单了解sokcet模块用法 服务器代码如下: import socket def file_deal(file_name): # 定义函数用于处理用户索要下载的文件 try: # 二进制方式读取 files = open(file_name, "rb") mes = f

  • python使用socket实现的传输demo示例【基于TCP协议】

    本文实例讲述了python使用socket实现的传输demo.分享给大家供大家参考,具体如下: socket传输,客户端代码 import socket def main(): tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器位于本机 9999 tcp_client_socket.connect( ("192.168.27.72", 9999) ) # 告诉服务器,我要下载哪一个文件

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

    本文实例为大家分享了python3实现CS架构文件传输的具体代码,供大家参考,具体内容如下 1.目标: 基于tcp实现CS架构的文件传输 指令列表:(1)get:从服务器端下载文件 (2)put:向服务器端上传文件 (3)list:获得服务器端的目录 2.socket模块函数: (1)send和sendall:send的作用是发送TCP数据,返回发送的数据大小.send函数不保证将所有数据全部发送,因此可能需要重复多次才能完成所有数据的发送.sendall的作用是发送完整的TCP数据,成功时返回

  • 基于socket和javaFX简单文件传输工具

    本文实例介绍了基于socket和javaFX简单文件传输工具,分享给大家供大家参考,具体内容如下 package application; import java.io.File; import org.james.component.ButtonBox; import org.james.component.FileReceiverGrid; import org.james.component.FileSenderGrid; import javafx.application.Applica

  • Linux网络编程之基于UDP实现可靠的文件传输示例

    了解网络传输协议的人都知道,采用TCP实现文件传输很简单.相对于TCP,由于UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方法就是给数据包编号,按照包的顺序接收并存储,接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送. 下面展示的是基于linux下C语言实现的一个示例程序,该程序定义一个包的结构体,其中

  • Java基于TCP方式的二进制文件传输

    一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1.基于Java Socket的二进制文件传输(包括图片,二进制文件,各种文档work,PDF) 2.SwingWorker集合JProgressBar显示实时传输/接受完成的百分比 3.其它一些Swing多线程编程技巧 首先来看一下整个Dome的Class之间的关系图: 下面按照上图来详细解释各个类的

  • python实现TCP文件传输

    前几天已经讲过了UDP协议下大文件传输的python实现代码,今天再实现TCP协议下大文件传输的python实现代码. TCP和UDP的实现过程还是比较不一样的. 实现代码: 服务端: import socket import time s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('127.0.0.1',9999)) s.listen(5) print('Waiting for connection...') whil

  • python cs架构实现简单文件传输

    本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下 要实现简单文件的传输我们必须考虑这些问题: 1.什么是c/s架构? 顾名思义,就是客户端端/服务器架构.不同的人可能回答不一,但是有一点是相同的:服务器是一个软件或硬件,用于向一个或多个客户端提供所需要的服务,服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后等待其他的请求. 2.客户端与服务端如何通信? 其实说白了就是互联网中两个主机该如何通信,首先我们用ip地址可以标示一台主机,这样就可以通信了

  • 基于python3实现socket文件传输和校验

    基于socket的文件传输并进行MD5值校验,供大家参考,具体内容如下 文件传输分为两个类,一个是服务端,一个是客户端. 客户端发起发送文件或接收文件的请求,服务端收到请求后接收或发送文件,最后进行MD5值的校验 socket数据通过struct模块打包 需要发送文件到服务端时,调用sendFile函数,struct包内包含文件信息.文件大小.文件MD5等信息,服务端接收到文件后进行MD5值校验,校验成功后则返回成功 需要从服务器下载文件时,调用recvFile函数,收到文件后进行MD5校验 c

  • Java基于Socket的文件传输实现方法

    本文实例讲述了Java基于Socket的文件传输实现方法.分享给大家供大家参考,具体如下: 1. Java代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Ser

随机推荐