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

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

要实现简单文件的传输我们必须考虑这些问题:

1.什么是c/s架构?

顾名思义,就是客户端端/服务器架构。不同的人可能回答不一,但是有一点是相同的:服务器是一个软件或硬件,用于向一个或多个客户端提供所需要的服务,服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后等待其他的请求。

2.客户端与服务端如何通信?

其实说白了就是互联网中两个主机该如何通信,首先我们用ip地址可以标示一台主机,这样就可以通信了么?当然也不行,我们还得标示主机中的进程,当然协议也是不可或缺的,是udp报文协议还是tcp数据流协议,这的看你个人的需求。用套介子来作为一个标示符,唯一标识网络进程。

想明白这两个问题我觉得这个问题有三分之一已经解决了,接下来呢我选择tcp协议来传输。

服务端:

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

bind()函数来把地址族中一个特定地址赋给socket,简单来说就是把一个ipv4/ipv6地址+端口号组合赋给socket

listen()函数把socket变成被动类型的,等待客户连接请求。

当客户端发来消息时用accept()函数来接受请求,同时给服务端返回客户端的socket描述字,接下来服务端以接收到的描述字来向客户端发送信息以及接受信息。

我们这个程序是实现文件传输,我的想法是类似于ftp程序接受客户上传下载文件的需求。服务端启动后监听端口(我用的9500)等待客户连接。客户端三次握手建立连接后,客户输入命令来向客户端发起请求,输入‘ls'命令可以查看服务端可下载的文件,输入‘put   文件名',‘get  文件名'可以上传下载文件。上传文件时客户端打开本地文件以二进制方式读取文件内容并同时调用send()函数发送文件内容,服务端以写方式打开文件并将客户端上传内容写入文件,实现文件的上传。下载文件与此类似,客户端上传送‘get  文件名'命令同时以写方式打开文件 ,服务端收到命令以读方式打开文件,并发送给服务端。

tcp三次握手建立连接:

当客户端调用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返回,至此三次握手完毕,连接建立。

tcp四次挥手断开连接:

某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;接收到这个FIN的源发送端TCP对它进行确认。

服务端代码:

#!/usr/bin/env python
from socket import *
import time
import sys
import os

HOST = 'localhost'
PORT = 9500
BUFIZ = 1024
ADDR = (HOST,PORT)

def recvfile(filename):
  print 'starting receive file...'
  f = open(filename,'wb')
  cliSockfd.send('no problem')
  while True:
    data = cliSockfd.recv(4096)
    if data == 'EOF':
      print 'recved file success!'
      break
    f.write(data)
  f.close()

def sendfile(filename):
  print 'starting send file...'
  cliSockfd.send('no problem')
  f = open(filename,'rb')
  while True:
    data = f.read(4096)
    if not data:
      break
    cliSockfd.send(data)
  f.close()
  time.sleep(1)
  cliSockfd.send('EOF')
  print 'send file success!'
def handle1(act,filename):
  if act == 'put':
    print 'recving msg!'
    recvfile(filename)
  elif act == 'get':
    print 'sending msg!'
    sendfile(filename)
  else:
    print 'error!'

def handle2(act):
  if act == 'ls':
    path = sys.path[0]
    every_file = os.listdir(path)
    for filename in every_file:
      cliSockfd.send(filename + ' ')
    time.sleep(1)
    cliSockfd.send('EOF')
    print 'all filename has send to client success!'
  else:
    print 'command error'

sockfd = socket(AF_INET,SOCK_STREAM)
sockfd.bind(ADDR)
sockfd.listen(5)
while True:
  print 'waiting for connection...'
  cliSockfd,addr = sockfd.accept()
  print '...connected from:',addr

  while True:
    msg = cliSockfd.recv(4096)
    if msg == 'close':
      print 'client closed'
      break
    info = msg.split()
    if len(info) == 2:
      handle1(*info)
    elif len(info) == 1:
      handle2(*info)
    else:
      print 'command error!'
      break

客户端代码:

#!/usr/bin/env python
import sys
import socket
import time
HOST = 'localhost'
PORT = 9500
BUFSIZ = 1024
ADDR = (HOST,PORT)

cliSockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

def recvfile(filename):
  f = open(filename,'wb')
  while True:
    msg = cliSockfd.recv(4096)
    if msg == 'EOF':
      print 'recv file success!'
      break
    f.write(msg)
  f.close
def sendfile(filename):
  f = open(filename,'rb')
  while True:
    msg = f.read(4096)
    if not msg:
       break
    cliSockfd.sendall(msg)
  f.close()
  time.sleep(1)
  cliSockfd.sendall('EOF')
  print 'send file success'
def confirm(cliSockfd,client_command):
  cliSockfd.send(client_command)
  msg = cliSockfd.recv(4096)
  if msg == 'no problem':
    return True

def handle1(act,filename):
  if act == 'put':
    if confirm(cliSockfd,client_command):
      sendfile(filename)
    else:
      print 'server error1!'
  elif act == 'get':
    if confirm(cliSockfd,client_command):
      recvfile(filename)
    else:
      print 'server error2!'
  else:
    print 'command error!'
def handle2(act):
  if act == 'ls':
    cliSockfd.send('ls')
    while True:
      msg = cliSockfd.recv(1024)
      if msg == 'EOF':
        break
      print msg
  else:
    print 'command error'

try:
  cliSockfd.connect(ADDR)
  print 'connect to ',ADDR
  while True:
    client_command = raw_input('>>>')
    if not client_command:
      continue
    msg = client_command.split()
    if len(msg) == 2:
      handle1(*msg)
    elif len(msg) == 1 and msg != ['close']:
      handle2(*msg)
    elif len(msg) == 1 and msg == ['close']:
      cliSockfd.send('close')
      break
    else:
      print 'command error'
except socket.error,e:
  print 'error:',e
finally:
  cliSockfd.close()

运行截图:

服务端:

客户端:

欢迎各位大牛,多提宝贵意见。

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

(0)

相关推荐

  • 用Python编写一个简单的CS架构后门的方法

    0x00:事先说明 你已经攻陷了对方主机且获得了最高权限. 对方的本地防火墙会丢弃所有的外来数据包. 这个后门不会仅绑定在某一个端口上. 这段代码很容易写,毕竟是 Python(准确说是 Python 2.x). 0x01:工作原理 如你所见,客户端将伪造具有 ICMP 负载的特定数据包,另一方面在服务端,也就是我们的被攻击主机,将会接受我们发送的数据包,即使它开启了本地的防火墙(丢弃所有外来数据包).关键在于无线网卡的监听模式,它无需和 AP 建立连接却可以和接受所有流经空气的数据包. 我们会

  • 使用python的pandas库读取csv文件保存至mysql数据库

    第一:pandas.read_csv读取本地csv文件为数据框形式 data=pd.read_csv('G:\data_operation\python_book\chapter5\\sales.csv') 第二:如果存在日期格式数据,利用pandas.to_datatime()改变类型 data.iloc[:,1]=pd.to_datetime(data.iloc[:,1]) 注意:=号,这样在原始的数据框中,改变了列的类型 第三:查看列类型 print(data.dtypes) 第四:方法一

  • Python简单爬虫导出CSV文件的实例讲解

    流程:模拟登录→获取Html页面→正则解析所有符合条件的行→逐一将符合条件的行的所有列存入到CSVData[]临时变量中→写入到CSV文件中 核心代码: ####写入Csv文件中 with open(self.CsvFileName, 'wb') as csvfile: spamwriter = csv.writer(csvfile, dialect='excel') #设置标题 spamwriter.writerow(["游戏账号","用户类型","游戏

  • Python Pandas批量读取csv文件到dataframe的方法

    PYTHON Pandas批量读取csv文件到DATAFRAME 首先使用glob.glob获得文件路径.然后定义一个列表,读取文件后再使用concat合并读取到的数据. #读取数据 import pandas as pd import numpy as np import glob,os path=r'e:\tj\month\fx1806' file=glob.glob(os.path.join(path, "zq*.xls")) print(file) dl= [] for f i

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

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

  • python pandas读取csv后,获取列标签的方法

    在Python中,经常会去读csv文件,如下 import pandas as pd import numpy as np df = pd.read_csv("path.csv") data = np.array(df.loc[:,:]) 通过这种方式得到的data,不包含第一行,一般来说,第一行即是列标签.那么如何获取第一行的内容呢.如下 column_headers = list(df.columns.values) 以上这篇python pandas读取csv后,获取列标签的方法

  • Python读取mat文件,并转为csv文件的实例

    初学Python,遇到需要将mat文件转为csv文件,看了很多博客,最后找到了解决办法,代码如下: #方法1 from pandas import Series,DataFrame import pandas as pd import numpy as np import h5py datapath = 'E:/workspacelxr/contem/data.mat' file = h5py.File(datapath,'r') file.keys() def Print(name):prin

  • Python对CSV、Excel、txt、dat文件的处理

    python读取txt文件:(思路:先打开文件,读取文件,最后用for循环输出内容) 1.读取 1.1基于python csv库 #3.读取csv至字典x,y import csv # 读取csv至字典 csvFile = open(r'G:\训练小样本.csv', "r") reader = csv.reader(csvFile) #print(reader) # 建立空字典 result = {} i=0 for item in reader: if reader.line_num

  • python生成以及打开json、csv和txt文件的实例

    生成txt文件: mesg = "hello world" with open("test.txt", "w") as f: f.write("{}".format(mesg)) print("加载完成!") 生成json文件: import json mesg = {"key": "value"} with open("test.json", &

  • python 循环读取txt文档 并转换成csv的方法

    如下所示: # -*- coding: utf-8 -*- """ Created on Fri Jul 29 15:49:06 2016 @author: user """ import os #从文件中读取某一行 linecache.checkcache可以刷新cache ,linecache可以缓存某一行的信息 import linecache def GetFileNameAndExt(filename): (filepath,tempf

随机推荐