pythonはTCPを使用してファイル転送を実現する(CentOS 6.4,python 2.6テスト合格)


今日の午后3时间の时间を使って2つの小さいプログラムを书いて、かなり心を騒がせました!半日エラーを探して、サービス側の送信レートとクライアントの受信レートが同期していないことに気づいた.
サービス・エンド・プログラム:
#!/usr/bin/env python

# Time-stamp: <2013-06-18 18:39:02 Tuesday by pein>

# Email: 

# -*- coding: utf-8 -*-
import socket, time
import dir

HOST = socket.gethostname()
PORT = 10019
ADDR = (HOST, PORT)
BUFFERSIZE = 1024
fileServer = socket.socket()
fileServer.bind(ADDR)
fileServer.listen(5)

while True:
    print "waiting for connection..."
    tcpCliSock, addr = fileServer.accept()
    print 'connected form:', addr

    while True:
        tcpCliSock.send("Please input a directory name:")
        direRequest = tcpCliSock.recv(BUFFERSIZE)
        if not direRequest:
            break
        fileList = dir.listDir(direRequest)
        tcpCliSock.send("There is %d files in the directory"%len(fileList))
        time.sleep(0.01)
        tcpCliSock.send(str(len(fileList)))
        print len(fileList)
        for eachfile in fileList:
            time.sleep(0.01)
            tcpCliSock.send(eachfile)
        tcpCliSock.send("Please input a file name you want to get:")
        
        fileRequest = tcpCliSock.recv(BUFFERSIZE)
        fd = open(fileRequest)
        tcpCliSock.send(str(len(fd.readlines())))
        fd.seek(0)
        for eachLine in fd:
            tcpCliSock.send(eachLine)
            time.sleep(0.01)
        fd.close()
 
    print "over"
    tcpCliSock.close()
クライアントコード:
#!/usr/bin/env python

# Time-stamp: <2013-06-18 18:38:39 Tuesday by pein>

# Email: 

# -*- coding: utf-8 -*-

import socket

HOST = socket.gethostname()
PORT = 10019
BUFFERSIZE = 1024
ADDR = (HOST, PORT)

fileClient = socket.socket()
fileClient.connect(ADDR)

while True:
    info = fileClient.recv(BUFFERSIZE)
    print info
    direRequest = raw_input('> ')
    if not direRequest:
        break
    fileClient.send(direRequest)
    info = fileClient.recv(BUFFERSIZE)
    print info
    sumOfFile = fileClient.recv(BUFFERSIZE)
    print sumOfFile
    sumOfFile = int(sumOfFile)
    print sumOfFile
    for count in range(sumOfFile):
        print fileClient.recv(BUFFERSIZE)

    info = fileClient.recv(BUFFERSIZE)
    print info
    fileRequest = raw_input('> ')
    fileClient.send(fileRequest)
    lineOfFile = int(fileClient.recv(BUFFERSIZE))
    for count in range(lineOfFile):
        print fileClient.recv(BUFFERSIZE),

fileClient.close()
コンピュータネットワークとpythonを勉強しているので、コードがぼろぼろです.
クライアントは、検索をクライアントに伝えるディレクトリをサービス側に送信します.クライアントがサービス側にファイルを送信すると、サービス側はそのファイルをクライアントに渡すことができます.
基本的な考え方は、TCPサービス側とTCPクライアントを構築することです.クライアント(ホストはネイティブ)を先に実行し、ポートを常にリスニングします.クライアントを実行すると、サービス側に接続の確立を要求します.接続が確立されると、サービス側はクライアントサービスに新しいソケットを作成します.両側でお互いに情報を伝えることができます.
その後、サービス側の送信レートがクライアントの受信レートと同期せず、情報受信が正しくないという問題が発生した.私が使っている解決策は、サービス側がメッセージを送信するたびに0.01秒睡眠をとることで、効率に影響を与えるような気がします.これはいい方法ではありませんが、もっといい方法も考えられます.とりあえず置いておきます.
先日、ネットの授業で先生はクライアントとサービス側のTCPプロトコルの同期メカニズムを話し、いくつかのことを話しました.これらのメカニズムはpythonのsocketが提供すると思っていたが(提供したかもしれないが、私は知らない)、今回の実験を経て、そうではないようだ.まず問題をここに残しておいて、時間があれば解決します.