最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python cs架構(gòu)實現(xiàn)簡單文件傳輸

 更新時間:2020年03月20日 14:28:04   作者:AbnerKou  
這篇文章主要為大家詳細介紹了python cs架構(gòu)實現(xiàn)簡單文件傳輸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家分享了python cs架構(gòu)實現(xiàn)簡單文件的傳輸代碼,供大家參考,具體內(nèi)容如下

要實現(xiàn)簡單文件的傳輸我們必須考慮這些問題:

1.什么是c/s架構(gòu)?

顧名思義,就是客戶端端/服務器架構(gòu)。不同的人可能回答不一,但是有一點是相同的:服務器是一個軟件或硬件,用于向一個或多個客戶端提供所需要的服務,服務器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然后等待其他的請求。

2.客戶端與服務端如何通信?

其實說白了就是互聯(lián)網(wǎng)中兩個主機該如何通信,首先我們用ip地址可以標示一臺主機,這樣就可以通信了么?當然也不行,我們還得標示主機中的進程,當然協(xié)議也是不可或缺的,是udp報文協(xié)議還是tcp數(shù)據(jù)流協(xié)議,這的看你個人的需求。用套介子來作為一個標示符,唯一標識網(wǎng)絡進程。

想明白這兩個問題我覺得這個問題有三分之一已經(jīng)解決了,接下來呢我選擇tcp協(xié)議來傳輸。

服務端:

        采用socket()函數(shù) 定義socket描述字

        bind()函數(shù)來把地址族中一個特定地址賦給socket,簡單來說就是把一個ipv4/ipv6地址+端口號組合賦給socket

        listen()函數(shù)把socket變成被動類型的,等待客戶連接請求。

        當客戶端發(fā)來消息時用accept()函數(shù)來接受請求,同時給服務端返回客戶端的socket描述字,接下來服務端以接收到的描述字來向客戶端發(fā)送信息以及接受信息。

        我們這個程序是實現(xiàn)文件傳輸,我的想法是類似于ftp程序接受客戶上傳下載文件的需求。服務端啟動后監(jiān)聽端口(我用的9500)等待客戶連接??蛻舳巳挝帐纸⑦B接后,客戶輸入命令來向客戶端發(fā)起請求,輸入‘ls'命令可以查看服務端可下載的文件,輸入‘put   文件名',‘get  文件名'可以上傳下載文件。上傳文件時客戶端打開本地文件以二進制方式讀取文件內(nèi)容并同時調(diào)用send()函數(shù)發(fā)送文件內(nèi)容,服務端以寫方式打開文件并將客戶端上傳內(nèi)容寫入文件,實現(xiàn)文件的上傳。下載文件與此類似,客戶端上傳送‘get  文件名'命令同時以寫方式打開文件 ,服務端收到命令以讀方式打開文件,并發(fā)送給服務端。

tcp三次握手建立連接:

當客戶端調(diào)用connect時,觸發(fā)了連接請求,向服務器發(fā)送了SYN J包,這時connect進入阻塞狀態(tài);服務器監(jiān)聽到連接請求,即收到SYN J包,調(diào)用accept函 數(shù)接收請求向客戶端發(fā)送SYN K ,ACK J+1,這時accept進入阻塞狀態(tài);客戶端收到服務器的SYN K ,ACK J+1之后,這時connect返回,并對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。

tcp四次揮手斷開連接:

某個應用進程首先調(diào)用close主動關(guān)閉連接,這時TCP發(fā)送一個FIN M;另一端接收到FIN M之后,執(zhí)行被動關(guān)閉,對這個FIN進行確認。它的接收也作為文件結(jié)束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數(shù)據(jù);一段時間之后,接收到文件結(jié)束符的應用進程調(diào)用close關(guān)閉它的socket。這導致它的TCP也發(fā)送一個FIN N;接收到這個FIN的源發(fā)送端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()

運行截圖:

服務端:

客戶端:

歡迎各位大牛,多提寶貴意見。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用正則實現(xiàn)計算字符串算式

    Python使用正則實現(xiàn)計算字符串算式

    這篇文章主要介紹了Python使用正則實現(xiàn)計算字符串算式的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • django執(zhí)行原生SQL查詢的實現(xiàn)

    django執(zhí)行原生SQL查詢的實現(xiàn)

    本文主要介紹了django執(zhí)行原生SQL查詢的實現(xiàn),主要有兩種方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python中可變變量與不可變變量詳解

    Python中可變變量與不可變變量詳解

    這篇文章主要介紹了Python中可變變量與不可變變量,但Python中沒有指針和引用的概念,導致很多時候參數(shù)的傳遞和調(diào)用的時候會產(chǎn)生疑問:我到底是復制了一份新的做操作還是在它指向的內(nèi)存操作?下面我們就帶著疑問去閱讀下面文章內(nèi)容吧
    2021-10-10
  • Pytorch中使用ImageFolder讀取數(shù)據(jù)集時忽略特定文件

    Pytorch中使用ImageFolder讀取數(shù)據(jù)集時忽略特定文件

    這篇文章主要介紹了Pytorch中使用ImageFolder讀取數(shù)據(jù)集時忽略特定文件,具有一的參考價值需要的小伙伴可以參考一下,希望對你有所幫助
    2022-03-03
  • python3寫爬取B站視頻彈幕功能

    python3寫爬取B站視頻彈幕功能

    本篇文章給大家講解一下如何用python3寫出爬取B站視頻彈幕的功能,有興趣的讀者們參考學習下吧。
    2017-12-12
  • PyTorch中view()與?reshape()的區(qū)別詳析

    PyTorch中view()與?reshape()的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于PyTorch中view()?與?reshape()?區(qū)別的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • Python 普通最小二乘法(OLS)進行多項式擬合的方法

    Python 普通最小二乘法(OLS)進行多項式擬合的方法

    今天小編就為大家分享一篇Python 普通最小二乘法(OLS)進行多項式擬合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python OpenCV實戰(zhàn)之與機器學習的碰撞

    Python OpenCV實戰(zhàn)之與機器學習的碰撞

    機器學習是人工智能的子集,為計算機以及其它具有計算能力的系統(tǒng)提供自動預測或決策的能力。本文主要介紹了OpenCV 提供的常見機器學習算法和技術(shù),用于解決計算機視覺項目中的實際問題,需要的朋友可以參考一下
    2021-12-12
  • 基于Python實現(xiàn)植物大戰(zhàn)僵尸游戲的示例代碼

    基于Python實現(xiàn)植物大戰(zhàn)僵尸游戲的示例代碼

    植物大戰(zhàn)僵尸是一款經(jīng)典的塔防類游戲,玩家通過種植各種植物來抵御僵尸的攻擊,本文將詳細介紹如何使用Python和Pygame庫來實現(xiàn)一個簡單的植物大戰(zhàn)僵尸游戲,文中通過代碼示例講解的非常詳細,感興趣的小伙伴跟著小編一起來看看吧
    2024-10-10
  • Python構(gòu)建一個文檔掃描器的實現(xiàn)

    Python構(gòu)建一個文檔掃描器的實現(xiàn)

    本文主要介紹了Python構(gòu)建一個文檔掃描器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03

最新評論

清涧县| 竹山县| 乡宁县| 陵水| 乌恰县| 鄢陵县| 嘉义市| 平定县| 仙游县| 忻城县| 新闻| 满洲里市| 驻马店市| 安图县| 福清市| 喀什市| 醴陵市| 六枝特区| 论坛| 霞浦县| 云安县| 改则县| 兴宁市| 灵璧县| 讷河市| 盐山县| 遵义市| 开化县| 轮台县| 张家界市| 宜城市| 襄汾县| 宁乡县| 大安市| 墨竹工卡县| 黔江区| 运城市| 双流县| 巍山| 秦安县| 红河县|