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 7月 16 21:03 .
drwxr-xr-x 3 root root 4096 7月 15 10:42 ..
-rw-r--r-- 1 root root 660 7月 15 17:43 socket_server_ftp1.py
-rw-r--r-- 1 root root 3398 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 0 7月 16 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 7月 16 21:02 .
drwxr-xr-x 3 root root 4096 7月 15 09:39 ..
-rw-r--r-- 1 root root 351 7月 15 17:46 socket_clent_ftp1.py
-rw-r--r-- 1 root root 2311 7月 16 21:00 socket_clent_ftpok.py
-rw-r--r-- 1 root root 382 7月 15 17:44 tab.py
-rw-r--r-- 1 root root 547 7月 15 17:44 tab.pyc
-rw-r--r-- 1 root root 408 7月 15 22:03 user_startup.py
-rw-r--r-- 1 root root 555 7月 15 22:10 user_startup.pyc
-rw-r--r-- 1 root root 14 7月 16 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 7月 16 21:03 .
drwxr-xr-x 3 root root 4096 7月 15 10:42 ..
-rw-r--r-- 1 root root 660 7月 15 17:43 socket_server_ftp1.py
-rw-r--r-- 1 root root 3398 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
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 7月 16 21:03 .
drwxr-xr-x 3 root root 4096 7月 15 10:42 ..
-rw-r--r-- 1 root root 660 7月 15 17:43 socket_server_ftp1.py
-rw-r--r-- 1 root root 3398 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 0 7月 16 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