日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python开发cs软件_python cs架构实现简单文件传输

發布時間:2024/4/19 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python开发cs软件_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()

運行截圖:

服務端:

客戶端:

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

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

總結

以上是生活随笔為你收集整理的python开发cs软件_python cs架构实现简单文件传输的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 插少妇视频 | 国产精品免费一区二区 | 色av一区二区三区 | 国产乱free国语对白 | 蜜桃tv一区二区三区 | 福利视频午夜 | 日韩免费中文字幕 | 在线免费观看日韩 | 成人性生活免费看 | 91精品福利视频 | 小小姑娘电影大全免费播放 | 国产成人精品aa毛片 | 欧美成人精品一区二区综合免费 | 色网视频| 日韩国产一区二区三区 | 叶全真三级 | www四虎com | 亚洲美女久久久 | 欧美色频 | 香蕉人妻av久久久久天天 | 日韩欧美一区二区三区免费观看 | 午夜视频网站 | 精品免费av | 医生强烈淫药h调教小说视频 | 日韩中文字幕免费在线观看 | 夜夜爱av| 一区二区在线视频观看 | 看片网站在线观看 | 国产黄色免费在线观看 | 丰满大乳少妇在线观看网站 | 呦呦网 | www.youjizz日本| 亚洲三级网| www污网站| 久久久久国产一区 | 黄色av一级 | 大胸奶汁乳流奶水出来h | 国产69精品久久久久久久 | 黄色欧美一级片 | 欧美裸体视频 | 欧美在线性爱视频 | 国产欧美日韩一区二区三区 | 最新黄色网页 | 亚洲欧洲国产视频 | 亚洲永久精品一区 | 欧美另类精品xxxx孕妇 | 亚洲AV成人午夜无码精品久久 | 亚洲天堂二区 | 玖玖爱资源站 | 乱色欧美 | 香蕉视频网址 | 天天综合一区 | 深夜福利视频在线观看 | 精品亚洲在线 | 青青草在线免费视频 | 国产精品美乳在线观看 | 国产第6页| 情欲少妇人妻100篇 黄色一级片欧美 | 黄a视频 | 射久久| 久久超级碰碰 | 色婷婷av一区二区三区麻豆综合 | 成人深夜福利在线观看 | 久久草视频在线 | 亚洲精品~无码抽插 | 天天综合久久 | 色老妹 | 久久激情av | 久久久在线观看 | 天天操夜夜干 | 福利综合网 | 在线一区二区三区 | 亚洲激情啪啪 | www久久精品| 狠狠干夜夜骑 | 亚洲色图 在线视频 | 黄色av免费播放 | 女裸全身无奶罩内裤内衣内裤 | 久久激情小说 | 免费在线观看黄色av | 欧美毛片在线 | 日本激情久久 | 国产一二三区在线 | 强伦人妻一区二区三区 | 欧美黄色免费视频 | 久久亚洲AV成人无码国产人妖 | 欧美久久一区二区三区 | 午夜影院在线看 | 美国毛片基地 | 香港台湾日本三级大全 | 色国产精品 | 高清不卡一区二区三区 | 国产精品国产三级国产在线观看 | 国产高清免费视频 | 欧美一区二区三区久久成人精品 | 日韩精品一区二区三区色欲av | 亚洲男人天堂2022 | 奶罩不戴乳罩邻居hd播放 | 亚洲天堂小视频 |