python網頁編程,python客戶端與服務器端_Python實現的FTP通信客戶端與服務器端功能示例

 2023-11-30 阅读 27 评论 0

摘要:本文實例講述了Python實現的FTP通信客戶端與服務器端功能。分享給大家供大家參考,具體如下:一 代碼1、服務端代碼python網頁編程。import socketimport threadingimport osimport structpython服務、#用戶賬號、密碼、主目錄#也可以把這些信息存放到數據庫中use

本文實例講述了Python實現的FTP通信客戶端與服務器端功能。分享給大家供大家參考,具體如下:

一 代碼

1、服務端代碼

python網頁編程。import socket

import threading

import os

import struct

python服務、#用戶賬號、密碼、主目錄

#也可以把這些信息存放到數據庫中

users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:\python 3.5'},

'lisi':{'pwd':'lisi567', 'home':'c:\\'}}

python連接服務器、def server(conn,addr, home):

print('新客戶端:'+str(addr))

#進入當前用戶主目錄

os.chdir(home)

軟件客戶端和服務器端實現,while True:

data = conn.recv(100).decode().lower()

#顯示客戶端輸入的每一條命令

print(data)

服務器端app、#客戶端退出

if data in ('quit', 'q'):

break

#查看當前文件夾的文件列表

python web。elif data in ('list', 'ls', 'dir'):

files = str(os.listdir(os.getcwd()))

files = files.encode()

conn.send(struct.pack('I', len(files)))

python recv,conn.send(files)

#切換至上一級目錄

elif ''.join(data.split()) == 'cd..':

cwd = os.getcwd()

python web服務器,newCwd = cwd[:cwd.rindex('\\')]

#考慮根目錄的情況

if newCwd[-1] == ':':

newCwd += '\\'

python服務器端開發,#限定用戶主目錄

if newCwd.lower().startswith(home):

os.chdir(newCwd)

conn.send(b'ok')

else:

conn.send(b'error')

#查看當前目錄

elif data in ('cwd', 'cd'):

conn.send(str(os.getcwd()).encode())

elif data.startswith('cd '):

#指定最大分隔次數,考慮目標文件夾帶有空格的情況

#只允許使用相對路徑進行跳轉

data = data.split(maxsplit=1)

if len(data) == 2 and os.path.isdir(data[1]) \

and data[1]!=os.path.abspath(data[1]):

os.chdir(data[1])

conn.send(b'ok')

else:

conn.send(b'error')

#下載文件

elif data.startswith('get '):

data = data.split(maxsplit=1)

#檢查文件是否存在

if len(data) == 2 and os.path.isfile(data[1]):

conn.send(b'ok')

fp = open(data[1], 'rb')

while True:

content = fp.read(4096)

#發送文件結束

if not content:

conn.send(b'overxxxx')

break

#發送文件內容

conn.send(content)

if conn.recv(10) == b'ok':

continue

fp.close()

else:

conn.send(b'no')

#無效命令

else:

pass

conn.close()

print(str(addr)+'關閉連接')

#創建Socket,監聽本地端口,等待客戶端連接

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

sock.bind(('', 10600))

sock.listen(5)

while True:

conn, addr = sock.accept()

#驗證客戶端輸入的用戶名和密碼是否正確

userId, userPwd = conn.recv(1024).decode().split(',')

if userId in users and users[userId]['pwd'] == userPwd:

conn.send(b'ok')

#為每個客戶端連接創建并啟動一個線程,參數為連接、客戶端地址、客戶主目錄

home = users[userId]['home']

t = threading.Thread(target=server, args=(conn,addr,home))

t.daemon = True

t.start()

else:

conn.send(b'error')

2、客戶端代碼

import socket

import sys

import re

import struct

import getpass

def main(serverIP):

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

sock.connect((serverIP, 10600))

userId = input('請輸入用戶名:')

#使用getpass模塊的getpass()方法獲取密碼,不回顯

userPwd = getpass.getpass('請輸入密碼:')

message = userId+','+userPwd

sock.send(message.encode())

login = sock.recv(100)

#驗證是否登錄成功

if login == b'error':

print('用戶名或密碼錯誤')

return

#整數編碼大小

intSize = struct.calcsize('I')

while True:

#接收客戶端命令,其中##>是提示符

command = input('##> ').lower().strip()

#沒有輸入任何有效字符,提前進入下一次循環,等待用戶繼續輸入

if not command:

continue

#向服務端發送命令

command = ' '.join(command.split())

sock.send(command.encode())

#退出

if command in ('quit', 'q'):

break

#查看文件列表

elif command in ('list', 'ls', 'dir'):

loc_size = struct.unpack('I', sock.recv(intSize))[0]

files = eval(sock.recv(loc_size).decode())

for item in files:

print(item)

#切換至上一級目錄

elif ''.join(command.split()) == 'cd..':

print(sock.recv(100).decode())

#查看當前工作目錄

elif command in ('cwd', 'cd'):

print(sock.recv(1024).decode())

#切換至子文件夾

elif command.startswith('cd '):

print(sock.recv(100).decode())

#從服務器下載文件

elif command.startswith('get '):

isFileExist = sock.recv(20)

#文件不存在

if isFileExist != b'ok':

print('error')

#文件存在,開始下載

else:

print('downloading.', end='')

fp = open(command.split()[1], 'wb')

while True:

print('.', end='')

data = sock.recv(4096)

if data == b'overxxxx':

break

fp.write(data)

sock.send(b'ok')

fp.close()

print('ok')

#無效命令

else:

print('無效命令')

sock.close()

if __name__ == '__main__':

if len(sys.argv) != 2:

print('Usage:{0} serverIPAddress'.format(sys.argv[0]))

exit()

serverIP = sys.argv[1]

if re.match(r'^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$', serverIP):

main(serverIP)

else:

print('服務器地址不合法')

exit()

二 運行結果

客戶端運行結果

希望本文所述對大家Python程序設計有所幫助。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/186736.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息