pythonはTCPを使用してファイル転送を実現する(CentOS 6.4,python 2.6テスト合格)
3187 ワード
今日の午后3时间の时间を使って2つの小さいプログラムを书いて、かなり心を騒がせました!半日エラーを探して、サービス側の送信レートとクライアントの受信レートが同期していないことに気づいた.
サービス・エンド・プログラム:
クライアントは、検索をクライアントに伝えるディレクトリをサービス側に送信します.クライアントがサービス側にファイルを送信すると、サービス側はそのファイルをクライアントに渡すことができます.
基本的な考え方は、TCPサービス側とTCPクライアントを構築することです.クライアント(ホストはネイティブ)を先に実行し、ポートを常にリスニングします.クライアントを実行すると、サービス側に接続の確立を要求します.接続が確立されると、サービス側はクライアントサービスに新しいソケットを作成します.両側でお互いに情報を伝えることができます.
その後、サービス側の送信レートがクライアントの受信レートと同期せず、情報受信が正しくないという問題が発生した.私が使っている解決策は、サービス側がメッセージを送信するたびに0.01秒睡眠をとることで、効率に影響を与えるような気がします.これはいい方法ではありませんが、もっといい方法も考えられます.とりあえず置いておきます.
先日、ネットの授業で先生はクライアントとサービス側のTCPプロトコルの同期メカニズムを話し、いくつかのことを話しました.これらのメカニズムはpythonのsocketが提供すると思っていたが(提供したかもしれないが、私は知らない)、今回の実験を経て、そうではないようだ.まず問題をここに残しておいて、時間があれば解決します.
サービス・エンド・プログラム:
#!/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が提供すると思っていたが(提供したかもしれないが、私は知らない)、今回の実験を経て、そうではないようだ.まず問題をここに残しておいて、時間があれば解決します.