1. 程式人生 > >用Python實現一個簡單的檔案傳輸協議

用Python實現一個簡單的檔案傳輸協議

寫個東西並非無聊或者練手,而是厭煩了每次都得重頭寫。我已經不是第一次碰到下面的情況:遠端到一臺可以連線內網的機器,結果發現其環境極為惡劣,沒有scp。最誇張的一次,我見過一臺機器連man都沒裝。所幸裝了ssh可以讓我遠端。但沒有scp怎麼傳檔案呢?ftp?試了幾個命令,沒有。HTTP?客戶端或者伺服器端軟體都沒有。python?有的。尼瑪,最後在遠端機器上用python寫了個簡單的伺服器,終於可以傳檔案了。當然,首先要傳scp。

被整了兩三回以後,我開始考慮把寫的東西儲存起來。這個程式最好小於一屏,以便我直接貼上到遠端終端。我考慮過實現一個已有協議,這樣,在客戶端可以用現成的工具。一番搜尋,無果,看起來最簡單的TFTP我都嫌太複雜了。於是我放棄這一想法,直接實現一個超原始的協議。最後寫出來的客戶端和伺服器端程式碼長度都在一屏之內(23行;校準終端24行;vi的狀態列佔了一行)。

我還是希望以後別遇到這種問題:用不能自動解決依賴的方法裝軟體太痛苦了。Python現在也像Perl一樣無處不在,不得不感嘆,有了這些指令碼語言幾乎相當於有了一切。

伺服器端:

#!/usr/bin/python
import SocketServer

# Format: name_len      --- one byte
#         name          --- name_len bytes
#         data          --- variable length
# Save data to name into current directory
addr = ('', 1234)
class MyTCPHandler (SocketServer.StreamRequestHandler):
        def handle (self):
                name_len = ord(self.rfile.read(1))
                name = self.rfile.read(name_len)
                print "Get request:%s"%name
                fd = open(name, 'w')
                cont = self.rfile.read(4096)    
                while cont:
                        fd.write(cont)
                        cont = self.rfile.read(4096)
                fd.close()
                print "Out :%s"%name

server = SocketServer.TCPServer(addr, MyTCPHandler)
server.serve_forever()

客戶端:

#!/usr/bin/python
from socket import *
import os.path
import sys
target = ('',1234)
def get_header (name):
        leng = len(name)
        assert leng < 250
        return chr(leng) + name

def send_file (name):
        basename = os.path.basename(name)
        header = get_header(basename)
        cont = open(name).read()
        s = socket (AF_INET, SOCK_STREAM)
        s.connect(target)
        s.sendall (header)
        s.sendall (cont)
        s.close()

for i in sys.argv[1:]:
        print i
        send_file (i)


相關推薦

Python實現一個簡單檔案傳輸協議

寫個東西並非無聊或者練手,而是厭煩了每次都得重頭寫。我已經不是第一次碰到下面的情況:遠端到一臺可以連線內網的機器,結果發現其環境極為惡劣,沒有scp。最誇張的一次,我見過一臺機器連man都沒裝。所幸裝了ssh可以讓我遠端。但沒有scp怎麼傳檔案呢?ftp?試了幾個命令,沒有

類方法實現python實現一個簡單的單詞本,添加/查找/刪除單詞。

end code div keys style 成功 move print utf 1.實現一個簡單的單詞本,功能: ①添加單詞,當所添加的單詞已存在時,讓用戶知道 ②查找單詞,當查找的單詞不存在時,讓用戶知道 ③刪除單詞,當刪除的單詞不存在時,讓用戶知道 以上

【人工智慧】Python實現一個簡單的人臉識別,原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可以直接來使用某些模型

【人工智能】Python實現一個簡單的人臉識別,原來我和這個明星如此相似

數值 但是 智能 深度學習 lib python 數學 三方 python實現 近幾年來,興起了一股人工智能熱潮,讓人們見到了AI的能力和強大,比如圖像識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數

Python實現一個簡單的——人臉相似度對比

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可以直

【很有趣】Python實現一個簡單的人臉識別,原來我和這個明星如此相似

近幾年來,興起了一股人工智慧熱潮,讓人們見到了AI的能力和強大,比如影象識別,語音識別,機器翻譯,無人駕駛等等。總體來說,AI的門檻還是比較高,不僅要學會使用框架實現,更重要的是,需要有一定的數學基礎,如線性代數,矩陣,微積分等。 幸慶的是,國內外許多大神都已經給我們造好“輪子”,我們可

Python 實現一個簡單的postman功能

用Python 實現一個簡單的postman功能 import os import requests import json import defaultdict as default_dict class PostMan: __instance = None

【龍書筆記】Python實現一個簡單數學表示式從中綴到字尾語法的翻譯器(採用遞迴下降分析法)

上篇筆記介紹了語法分析相關的一些基礎概念,本篇筆記根據龍書第2.5節的內容實現一個針對簡單表示式的字尾式語法翻譯器Demo。 備註:原書中的demo是java例項,我給出的將是邏輯一致的Python版本的實現。在簡單字尾翻譯器程式碼實現之前,還需要介紹幾個基本概念。1. 自

python實現簡單Server/Client檔案傳輸

還是那個題目(題目和流程見java版本),感覺光用java寫一點新意也沒有,恰巧剛學習了python,何不拿來一用,呵呵: 伺服器端: python 程式碼 importSocketServer, time class MyServer(SocketS

pythontcp實現區域網內檔案傳輸(文字,圖片,視訊)

功能: 可以利用python建立的TCP客戶端從我們自己搭建的TCP伺服器上下載檔案. 實現需求: 安裝socket模組 簡單瞭解sokcet模組用法 伺服器程式碼如下: import socket def file_deal(file_name):     # 定義

python一個簡單的爬蟲儲存在json檔案

學習python沒多久,所以只能寫一個很簡單的爬蟲啦~~ 我使用annacada 自帶的spyder來寫爬蟲的,這次我們要爬取得網站是http://www.drugbank.ca/drugs, 主要是爬取裡面每種藥物的資訊到json檔案中,包括有 DrugBank ID, 

基於TCP的TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議) 的c程式設計實現

我們或許都聽到過,TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議)是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不復雜、開銷不大的檔案傳輸服務。 本文就簡單的敘述下tftp的小檔案傳輸功能以及客戶端

java實現一個簡單的單戶登陸功能的思路

get 單用戶 這樣的 簡單的 lock ref 數據庫 清除 一個 引用 所謂“單用戶單賬戶登錄”是指:在同一系統中,一個用戶名不能在兩個地方同時登錄。 我們參照 QQ 實現效果:當某賬號在 A 處登錄後,在未退出的情況下,如果再到 B 處登錄,那麽,系統會擠下 A 處

C# 實現一個簡單的 Rest Service 供外部調

message [] operation rem adk www span method title 用 C# 實現一個簡單的 Restful Service 供外部調用,大體總結為4點: The service contract (the methods it o

python實現一個命令行文本編輯器

screen alt 保存 模型 既然 ffffff 圖片 單行 pda “這看起來相當愚蠢”——題記   不過我整個人都很荒誕,何妨呢?貼一張目前的效果圖   看起來很舒服,不是麽?即使一切都是個幌子:光標只能在最後,按一下上下左右就會退出,一行超出75個字符

python一個簡單的excel表格獲取當時的linux系統信息

psutil 生成 之前 建立 set ces ext 流量 關閉 最近在學習excel表格的制作,順便結合之前學習的內容,利用python的兩個模板,分別是獲取系統信息的psutil,和生成excel表格的xlsxwriter。利用這兩個模板將生成一個簡單的excel表格

Python實現一個大數據搜索及源代碼

Python編程語言 Python案例講解 Python基礎精講 在日常生活中,大家了解搜索引擎如百度、360、搜狗、谷歌等,搜索是大數據領域裏常見的需求。Splunk和ELK分別是該領域在非開源和開源領域裏的領導者。本文利用很少的Python代碼實現了一個基本的數據搜索功能,試圖讓大家理解大數據

自己-Netty-實現一個簡單的-RPC

  轉自:http://thinkinjava.cn/2018/03/%E8%87%AA%E5%B7%B1%E7%94%A8-Netty-%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84-RPC/ 目錄: 需求

Vue實現一個簡單的輪播效果

Vue實現簡單的輪播效果,用的的一些常用系統指令: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" conte

python實現一個簡單的ftp程式

客戶端可以向伺服器端下載,上傳檔案 下載檔案指令:get_filename 上傳檔案指令:put_filename ftp工程目錄: ftp工作原理: put指令工作原理圖: put指令工作原理圖:   程式碼: 客戶端: impo