2012-03-23 12 views
1

私は、ソケットを介してファイルを送信して転送をタイミングすることで、アップロード速度とダウンロード速度を測定するネットワーククラスのプログラムを作成しました。私が抱えている問題は、サーバとクライアントが同じマシンで動作しているときにうまく話すことができるということですが、ネットワーク上の別のマシンにサーバプログラムを置くとすぐにファイル転送は行われません。彼らはお互いに話します(クライアントは「サーバに接続」と言い、サーバは「xxx.xxx.xxx.xxxからの接続」と言います)が、ファイル転送のサイズと速度は0と0で示されます。ネットワーク上のPythonサーバーとクライアントの関係

ここにサーバーコード:

import util 
import socket 
import os 
import shutil 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = "" 
port = 12345 
f = open("receivedfromclient.txt", "r+") 
print "Waiting for clients..." 
s.bind((host, port)) 
s.listen(5) 
c, addr = s.accept() 
print "Client connected:", addr 
start = time.clock() 
msg = c.recv(257024) 
stop = time.clock() 
duration = stop-start 
f.write(str(msg)) 
b = os.path.getsize("receivedfromclient.txt") 
print "File size = ", b, "bits" 
print "Time to transfer from client = ", duration, " seconds" 
bw = (b/duration)/1048576 
print "The upload bit rate is ", bw, "Mpbs" 
f.close() 
shutil.copy("receivedfromclient.txt", "sendtoclient.txt") 
f.open("sendtoclient.txt") 
c.send(f.read()) 
f.close() 
c.close() 
s.close() 

とクライアントコードは似ています

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = raw_input("Please enter host address: ")#socket.gethostname() 
port = 12345 
sendfile = raw_input("Please enter name of file to transfer: ") 
f = open(sendfile,"rb") 
g = open("receivedfromserver.txt","w") 
print "Connecting to ", host, port 
s.connect((host, port)) 
s.send(f.read()) 

のように。誰でも私がここで間違っていることを教えてもらえますか?

主要な1が、あなたが本当に何をしたいのか明確ではないという私見です: -

+0

まず、 's.accept'は' s.accept() 'になります。 – Marcin

+0

これは実行しているコードとまったく同じですか? 's.accept'は' s.accept() 'でなければなりません。 'b.os.path.getsize'は' b = os.path.getsize'でなければなりません – MattH

+0

いいえ、いくつかのタイプミスが修正されました。私はs.accept()とb = os.path.getsizeを行った。申し訳ありません。 – crypto

答えて

0

うーん、少なくともいくつかの問題があります。ここで

は、いくつかの発言であなたのコードです:ここ

# import util <-- NOT NEEDED 
import socket 
import os 
import shutil 
import time # <-- Added 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = "" 
port = 12345 
f = open("receivedfromclient.txt", "r+") 
print "Waiting for clients..." 
s.bind((host, port)) 
s.listen(5) 
c, addr = s.accept() # <-- FORGOTTEN() 
print "Client connected:", addr 
start = time.clock() 
msg = c.recv(257024) # <-- You need some loop here to get the whole file 
stop = time.clock() 
duration = stop-start 
f.write(str(msg)) 
b = os.path.getsize("receivedfromclient.txt") # <-- = instead of . 
print "File size = ", b, "bits" 
print "Time to transfer from client = ", duration, " seconds" 
bw = (b/duration)/1048576 
print "The upload bit rate is ", bw, "Mpbs" 
f.close() 
shutil.copy("receivedfromclient.txt", "sendtoclient.txt") 
f.open("sendtoclient.txt") 
c.send(f.read()) 
f.close() 
c.close() 
s.close() 

一つの問題は、そのスタートは、ほとんどすべての場合に停止するように等しく、である - ので、あなたは(b/duration)でゼロによる除算エラーを取得します。

クライアント部分で少なくともimport socketがありません。 gはまったく必要ありません。

あなたがしたいことをさらに説明してください。

ファイルを転送する場合は、(sftp、rsync、nc、...など)さまざまな方法があります。

+0

クライアントからサーバーへファイルを送信し、ソケット経由でファイルを送信し、その移動時間を測定して速度を決定するプログラムを作成する必要があります。私は、接続が行われたときにサーバー上で時計を開始し、ファイルが転送されると停止し、新しいファイルにファイルをコピーして、新しいファイルをクライアントに送り返します。私はクライアント上でソケットをインポートしました。その部分はここには表示されませんでした。私が言ったように、両方が同じマシン上で動いている限り、それは動作し(転送してスピードの結果を与える)。 – crypto

関連する問題