2012-03-23 136 views
1

我爲我的網絡類編寫了一個程序,它通過在套接字上發送文件並計時傳輸來測量上傳和下載速度,並使用Python。我遇到的問題是服務器和客戶端在同一臺計算機上運行時可以說得很好,但只要將服務器程序放在我的網絡上的另一臺計算機上,就不會發生文件傳輸。他們互相交談(客戶端說「連接到服務器」,服務器說「從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()) 

等。有人可以告訴我我在做什麼錯嗎?

+0

首先,'s.accept'應該變成's.accept()'。 – Marcin 2012-03-23 15:34:00

+0

這就是你正在運行的代碼嗎? 's.accept'應該是's.accept()'。 'b.os.path.getsize'應該是'b = os.path.getsize' – MattH 2012-03-23 15:36:05

+0

不,我有一些拼寫錯誤,現在修正了。我做了s.accept()和b = os.path.getsize。對於那個很抱歉。 – crypto 2012-03-23 18:38:54

回答

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 2012-03-23 18:43:13