1. 程式人生 > >python --利用Socket多執行緒的FTP程式

python --利用Socket多執行緒的FTP程式

python –利用Socket多執行緒的FTP程式

1.程式碼
伺服器端程式碼:

root@kali:~/python/socket/ftp# pwd
/root/python/socket/ftp
root@kali:~/python/socket/ftp# ls
socket_server_ftp1.py  socket_server_ftpok.py  tab.py  tab.pyc  xwb.txt
root@kali:~/python/socket/ftp# ls -a
.  ..  socket_server_ftp1.py  socket_server_ftpok.py  tab.py  tab.pyc  xwb.txt
root@kali:~/python/socket/ftp# ls -la
總用量 20 drwxr-xr-x 2 root root 4096 716 21:03 . drwxr-xr-x 3 root root 4096 715 10:42 .. -rw-r--r-- 1 root root 660 715 17:43 socket_server_ftp1.py -rw-r--r-- 1 root root 3398 716 21:00 socket_server_ftpok.py -rw-r--r-- 1 root root 0 715 22:11 tab.py -rw-r--r-- 1 root root 547 715 17:45
tab.pyc -rw-r--r-- 1 root root 0 716 21:03 xwb.txt root@kali:~/python/socket/ftp# cat socket_server_ftpok.py #!/usr/bin/python # --*-- coding:utf-8 --*-- import SocketServer import os from time import ctime,sleep #import socket #伺服器端IP地址192.168.72.129 HOST = '' PORT = 21567 ADDR = (HOST,PORT) class
MyRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):#呼叫MyRequestHandler類必須使用handle函式 print '...connected from :', self.client_address #print self.request.recv(1024) #self.request.send('Username') #----------Auth part------------------ if self.request.recv(1024) == 'auth': print 'auth' while 1: self.request.send('Username') username = self.request.recv(1024) sleep(1)#可以處理驗證賬戶延遲導致的宕機 if username == 'alex': self.request.send('correct') print 'Correct! Welcome!!' break else: self.request.send('incorrect') continue def SendFromClient(filename):#伺服器端傳送檔案函式,內建函式 print 'start receiving data' f = file(filename,'wb')#二進位制方式讀取開啟客戶端剛剛傳送過來的資料 while True:#一直迴圈接收客戶端傳送過來的資料 data = self.request.recv(4096) if data == 'file_send_done':break#如果收到file_send_done資訊,就結束 f.write(data)#否則把接收到的資訊寫入data檔案中 f.close() print 'file %s receive done!' % filename def SendToClient(filename):#伺服器端接收檔案函式,內建函式 print 'start sending file to client....' f = file(filename,'rb') #while True: file_data = f.read() #if not file_data:break self.request.sendall(file_data) f.close() print 'file %s sent to client finished!' % filename sleep(0.5) self.request.send('file_send_to_client_done') #ftp() while True: try: re_msg = self.request.recv(1024) print 'get',re_msg if re_msg.split()[0] == 'send': filename = re_msg.split()[1] self.request.send('ok2send') print 'ready to receive file from %s' % self.client_address[0] SendFromClient(filename)#呼叫傳送檔案函式 elif re_msg.split()[0] == 'get': filename = re_msg.split()[1] try: os.stat(filename) except OSError: msg = '\033[31;1mNo file %s found on FTP server\033[0m' % filename self.request.send(msg) print msg else: self.request.send('ok2get') sleep(0.5) print 'ready to send file to client %s' % self.client_address[0] SendToClient(filename)#呼叫接收檔案函式 elif re_msg == 'help' or re_msg == '?': help_msg = '''\033[32;1m\nhelp\nget filename\tget file from FTP server\nsend filename\tsend file to FTP server\nls\t\tshow file list on FTP server\033[0m''' self.request.send(help_msg) elif re_msg == 'ls': print 'print dir list',re_msg #file_list = os.listdir('.') #convert2string = '\t'.jion(file_list) file_list = os.popen('ls -lth') f_list = file_list.read() self.request.sendall(f_list) else: print 'invalid instruction' self.request.send('\033[31;1minvalid_instruction\033[0m') print "get from %s : %s" % (self.client_address[0],re_msg) #self.request.sendall('[%s] %s' % (ctime(),re_msg)) except IndexError: print "%s client %s logout !" % (ctime(),self.client_address[0]) break try: tcpServ = SocketServer.ThreadingTCPServer(ADDR,MyRequestHandler) print 'waiting for connection........' tcpServ.serve_forever() except socket.error,e: print 'error happend!!' root@kali:~/python/socket/ftp#

客戶端程式碼:

root@kali:~/python/socket/ftp# pwd
/root/python/socket/ftp
[email protected]:~/python/socket/ftp# ls -la
總用量 36
drwxr-xr-x 2 root root 4096  716 21:02 .
drwxr-xr-x 3 root root 4096  715 09:39 ..
-rw-r--r-- 1 root root  351  715 17:46 socket_clent_ftp1.py
-rw-r--r-- 1 root root 2311  716 21:00 socket_clent_ftpok.py
-rw-r--r-- 1 root root  382  715 17:44 tab.py
-rw-r--r-- 1 root root  547  715 17:44 tab.pyc
-rw-r--r-- 1 root root  408  715 22:03 user_startup.py
-rw-r--r-- 1 root root  555  715 22:10 user_startup.pyc
-rw-r--r-- 1 root root   14  716 21:02 xwb.txt



root@kali:~/python/socket/ftp# cat socket_clent_ftpok.py 
#!/usr/bin/env python
# --*-- coding:utf-8 --*--
import tab
import user_startup
import os
from time import sleep
from socket import *

#客戶端Ip地址192.168.72.130

HOST = '192.168.72.129'
PORT = 21567
BUFSIZ = 4096
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)

tcpCliSock.send('auth')
while 1:
    #tcpCliSock.send('auth')
    if tcpCliSock.recv(BUFSIZ) == 'Username':
        print 'please input your username:'
        while 1:
            data = raw_input('Username:>').strip()
            if len(data) == 0:continue
            else:break
        tcpCliSock.send(data)
        if tcpCliSock.recv(BUFSIZ) == 'correct':
            print 'welcome'
            break
        else:
            print 'Wrong pass'
            continue

while 1:
    data = raw_input('ftp>').strip()
    if len(data) == 0:continue
    if data == 'quit':
        tcpCliSock.close()
        break
    if data == 'get' or data == 'send':
        print '\033[31;1mNo file specified,usr %s filename \033[0m' % data
        continue
    if data == 'ls':
        tcpCliSock.send(data)
        file_list = tcpCliSock.recv(8096)
        print file_list
    if data.split()[0] == 'send':
        try:
            os.stat(data.split()[1])
        except  OSError:
            print '\033[31;1mNo file %s found on localhost\033[0m' % data.split()[1]
            continue
    tcpCliSock.send(data)
    print 'send msg:', data
    #tcpCliSock.send('%s\r\n' % data)
    recv_data = tcpCliSock.recv(BUFSIZ)
    if recv_data == 'ok2send':#向伺服器上傳輸檔案
        file2send = data.split()[1]
        f = open(file2send,'rb')#開啟本地檔案file2send
        file_data = f.read()#把整個檔案讀取到記憶體中
        f.close()
        tcpCliSock.sendall(file_data)#sendall一次性讀取的檔案資訊傳送完成,以一條訊息方式傳送
        print 'file sent finished!!'
        sleep(0.5)#等待0.5秒
        tcpCliSock.send('file_sent_done')
    if recv_data == 'ok2get':#客戶端傳送檔案到伺服器
        file2get = 'test/%s' % data.split()[1]
        f = file(file2get,'wb')
        file_get_done_mark = 0
        while True:#不斷給伺服器傳送檔案
            get_data = tcpCliSock.recv(1024)
            if get_data == 'file_send_to_client_done':
                file_get_done_mark = 1
                break
            f.write(get_data)
        f.close()
        if file_get_done_mark == 1:
            print 'Download file %s from FTP server success!' % file2get
            continue
        else:
            print 'wrong'
        print 'File %s receive done!!' % filename
    else:
        #print 'invalid cmd'
        print 'FTP server :',recv_data


root@kali:~/python/socket/ftp# 

客戶端匯入user_start.py檔案程式碼:

root@kali:~/python/socket/ftp# cat user_startup.py
#!/usr/bin/python
# --*-- coding:utf-8 --*--

import sys
import readline
import rlcompleter
import atexit
import os

#tab completion
readline.parse_and_bind('tab: complete')
#history file
histfile = os.path.join(os.environ['HOME'],'.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
    atexit.register(readline.write_history_file,histfile)

del os,histfile,readline,rlcompleter

root@kali:~/python/socket/ftp# 

2.執行情況
伺服器端:

root@kali:~/python/socket/ftp# python socket_server_ftpok.py 
waiting for connection........
...connected from : ('192.168.72.130', 53177)
auth
Correct! Welcome!!
get ls
print dir list ls
get ls
print dir list ls
get ?
get ls
print dir list ls
get ls
print dir list ls
get 
Sun Jul 16 21:02:20 2017 client 192.168.72.130 logout !
...connected from : ('192.168.72.130', 53178)
auth
Correct! Welcome!!
get ls
print dir list ls
get ls
print dir list ls
get ?
get send xwb.txt
ready to receive file from 192.168.72.130
start receiving data
...connected from : ('192.168.72.130', 53181)
auth
Correct! Welcome!!
get ls
print dir list ls
get ls
print dir list ls


#執行前
root@kali:~/python/socket/ftp# ls -la
總用量 20
drwxr-xr-x 2 root root 4096  716 21:03 .
drwxr-xr-x 3 root root 4096  715 10:42 ..
-rw-r--r-- 1 root root  660  715 17:43 socket_server_ftp1.py
-rw-r--r-- 1 root root 3398  716 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  715 22:11 tab.py
-rw-r--r-- 1 root root  547  715 17:45 tab.pyc
root@kali:~/python/socket/ftp# cat socket_server_ftpok.py 

#執行後
root@kali:~/python/socket/ftp# ls -la
總用量 20
drwxr-xr-x 2 root root 4096  716 21:03 .
drwxr-xr-x 3 root root 4096  715 10:42 ..
-rw-r--r-- 1 root root  660  715 17:43 socket_server_ftp1.py
-rw-r--r-- 1 root root 3398  716 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  715 22:11 tab.py
-rw-r--r-- 1 root root  547  715 17:45 tab.pyc
-rw-r--r-- 1 root root    0  716 21:03 xwb.txt
root@kali:~/python/socket/ftp# cat socket_server_ftpok.py 

客戶端1:

[email protected]:~/python/socket/ftp# python socket_clent_ftpok.py 
please input your username:
Username:>ss
Wrong pass
please input your username:
Username:>alex
welcome
ftp>ls
總用量 12K
-rw-r--r-- 1 root root 3.4K  7月 16 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  7月 15 22:11 tab.py
-rw-r--r-- 1 root root  547  7月 15 17:45 tab.pyc
-rw-r--r-- 1 root root  660  7月 15 17:43 socket_server_ftp1.py

send msg: ls
FTP server : 總用量 12K
-rw-r--r-- 1 root root 3.4K  7月 16 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  7月 15 22:11 tab.py
-rw-r--r-- 1 root root  547  7月 15 17:45 tab.pyc
-rw-r--r-- 1 root root  660  7月 15 17:43 socket_server_ftp1.py

ftp>?
send msg: ?
FTP server : 
help
get filename    get file from FTP server
send filename   send file to FTP server
ls      show file list on FTP server
ftp>send xwb.txt
send msg: send xwb.txt
file sent finished!!
FTP server : ok2send
ftp>ls

客戶端2:

[email protected]:~/python/socket/ftp# python socket_clent_ftpok.py 
please input your username:
Username:>alex
welcome
ftp>ls
總用量 12K
-rw-r--r-- 1 root root    0  7月 16 21:03 xwb.txt
-rw-r--r-- 1 root root 3.4K  7月 16 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  7月 15 22:11 tab.py
-rw-r--r-- 1 root root  547  7月 15 17:45 tab.pyc
-rw-r--r-- 1 root root  660  7月 15 17:43 socket_server_ftp1.py

send msg: ls
FTP server : 總用量 12K
-rw-r--r-- 1 root root    0  7月 16 21:03 xwb.txt
-rw-r--r-- 1 root root 3.4K  7月 16 21:00 socket_server_ftpok.py
-rw-r--r-- 1 root root    0  7月 15 22:11 tab.py
-rw-r--r-- 1 root root  547  7月 15 17:45 tab.pyc
-rw-r--r-- 1 root root  660  7月 15 17:43 socket_server_ftp1.py

ftp>

相關推薦

python --利用Socket執行FTP程式

python –利用Socket多執行緒的FTP程式 1.程式碼 伺服器端程式碼: root@kali:~/python/socket/ftp# pwd /root/python/socket/ftp root@kali:~/python/socket

python聊天程式socket+執行

用Python實現點對點的聊天,2個程式,一個是client.py,一個是server.py,通過本機地址127.0.0.1連線進行通訊,利用多執行緒把傳送訊息和接收訊息分開獨立進行。 clien

簡單的聊天程式(java的socket+執行

服務端 import java.net.*; import java.util.*; import java.io.*; public class ChatServer { ServerSocket server = null; Collection

利用執行進行程式優化

大家也許還記得 2005 年 3 月 C++ 大師 Herb Sutter 在 Dr.Dobb’s Journal 上發表了一篇名為《免費的午餐已經結束》的文章。文章指出:現在的程式設計師對效率、伸縮性、吞吐量等一系列效能指標相當忽視,很多效能問題都仰仗越來越快

Python TCP 客戶端(配合socket執行伺服器)

''' Python TCP 客戶端(配合socket多執行緒伺服器) by 鄭瑞國 1、建立網路套接字c 2、建立網路連線 3、收發資訊 ''' import socket c = socket.socket() #1、建立網路套接字c c.connect(('127.

java網路程式設計:9、基於TCP的socket程式設計(二)伺服器端迴圈監聽接收個客戶端_執行伺服器程式

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、核心程式碼編寫 1、伺服器端程式的編寫 2、客戶端程式的編寫 3、測試列印輸出 二、系列文章(java網路程式設計) 上篇講了基於tcp的程式設計的一些基礎知識

Python 執行程式不結束程序的程式不結束的區別

import time from threading import Thread from multiprocessing import Process #守護程序:主程序程式碼執行執行結束,守護程序隨之結束 #守護執行緒:守護執行緒會等待所有非守護執行緒執行結束才結束 def f1():

C# Socket執行程式設計例項-聊天程式

C#是微軟隨著VS.net新推出的一門語言。它作為一門新興的語言,有著C++的強健,又有著VB等的RAD特性。而且,微軟推出C#主要的目的是為了 對抗Sun公司的Java。大家都知道Java語言的強大功能,尤其在網路程式設計方面。於是,C#在網路程式設計方面也自然不甘

Python執行求和程式

今天寫了一個Python的多執行緒求和程式。滿足以下要求: 1、可以設定步長 2、步長可為負 3、支援小數 4、可指定執行緒數 5、處理各種無效輸入 程式如下: import threading from math import ceil result = 0 def

Python爬蟲之執行程序

前言 我們之前寫的爬蟲都是單個執行緒的?這怎麼夠?一旦一個地方卡到不動了,那不就永遠等待下去了?為此我們可以使用多執行緒或者多程序來處理。 首先宣告一點! 多執行緒和多程序是不一樣的!一個是 thread 庫,一個是 multiprocessing 庫。而多執行緒 thread 在 Pytho

Python 學習系列 -- 執行

轉載自:https://www.cnblogs.com/yeayee/p/4952022.html 多執行緒和多程序是什麼自行google補腦,廖雪峰官網也有,但是不夠簡潔,有點暈,所以就整個簡單的範例。   對於python 多執行緒的理解,我花了很長時間,搜尋的大部份文章都不夠

使用Python自定義執行,得到所有返回結果組成list

import threading import time """重新定義帶返回值的執行緒類""" class MyThread(threading.Thread): def __init__(self, func, args=()): super(MyThread,

Python佇列與執行及檔案鎖

佇列實現生產-多執行緒消費 先看程式碼 # -*- coding: utf-8 -*- import queue import threading mu = threading.Lock() class Producer(threading.Thread): def __init__(

python中的執行threading之儲存程序結果Queue

程式碼實現功能,將資料列表中的資料傳入,使用四個執行緒處理,將結果儲存在Queue中,執行緒執行完後,從Queue中獲取儲存的結果 import threading from queue import Queue def job(l, q): for i in range

python中的執行threading之新增執行:Thread()

百度百科:多執行緒 多執行緒(英語:multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理(Chi

Python實戰之執行程式設計thread模組

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Boost ptree 解析json字串 執行程式crash

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

理解一下Python中的執行,程序,協程

程序 一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。 執行緒, 排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多

Python中的執行程式設計,執行安全與鎖(一) 聊聊Python中的GIL 聊聊Python中的GIL python基礎之執行鎖機制 python--threading執行總結 Python3入門之執行threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n

python裡的執行

面向過程建立執行緒 import threading import time def sing(a): # threading.current_thread().name:建立執行緒時name的值 print('執行緒為:{},接收過來的引數為:{}'.format(thre