如何将python套接字流字符串值转换为浮点值?
我开始使用套接字发送文件。我了解到我可以通过套接字流发送1024个“块”,然后在服务器端将其分回来。我将服务器设置为首先获取一个字符串,该字符串包含它将接收的文件的大小,并在读取时进行比较,以查看读取是否完成 客户端代码为:如何将python套接字流字符串值转换为浮点值?,python,sockets,tcp,Python,Sockets,Tcp,我开始使用套接字发送文件。我了解到我可以通过套接字流发送1024个“块”,然后在服务器端将其分回来。我将服务器设置为首先获取一个字符串,该字符串包含它将接收的文件的大小,并在读取时进行比较,以查看读取是否完成 客户端代码为: BUFFER_SIZE = 1024 limit = os.path.getsize("test.db") #4096 bytes currentamt = BUFFER_SIZE f = open("test.db", "rb") l = f.read(BUFFER_SI
BUFFER_SIZE = 1024
limit = os.path.getsize("test.db") #4096 bytes
currentamt = BUFFER_SIZE
f = open("test.db", "rb")
l = f.read(BUFFER_SIZE)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(str(limit)) #first, send the limit
while(1):
s.send(l)
if currentamt >= limit:
break
l = f.read(BUFFER_SIZE)
currentamt += BUFFER_SIZE
print "still sending.."
s.close()
print "Done."
服务器代码如下所示:
while True:
conn, addr = s.accept()
print "Connection address: ", addr
f = open('rec.db', 'wb')
while 1:
limit = conn.recv(20) #this will get your limit size
limit = limit.rstrip()
limit = float(limit) #error in question
print limit
l = conn.recv(BUFFER_SIZE) #get byte bufferred back
while (1):
if currentamt >= limit:
f.write(l)
break
f.write(l)
l = conn.recv(BUFFER_SIZE)
currentamt += BUFFER_SIZE
f.close() #close your file after you're done
conn.close()
s.close()
如果我将服务器中的限制从20更改为10,我可以将其转换为浮点,但在print语句之后会出现错误!另外,在float(limit)语句之前,打印限制确实起作用,这让我感到困惑。TCP/IP保证您以正确的顺序获得正确的字节。它不能保证你收到的块的大小。注意,如果你发送1024字节,1024字节,1024字节-那么没有什么可以阻止TCP将其分割成512字节,512字节,512字节,512字节,512字节-甚至是更奇怪的东西。它还保留聚合块的权利,以形成2048字节、1024字节 为了避免这种情况,重要的是在发送和接收之间建立一个循环,或者使用一些使bufsock或twisted更容易的方法。就我个人而言,我认为twisted使这更容易,但其他很多事情更难,但也许这只是因为我写了bufsock Bufsock在 在您的特定情况下,我看到您以ASCII格式发送长度,但我没有看到您向字段宽度发送任何类型的终止字符或填充。这将在连接的另一端造成严重破坏,在这里,它似乎假设长度始终为20个字符。要解决此问题,您可以:
s.send(str(limit) + '\n')
…但仍然存在缺少循环的问题。Bufsock为您执行循环,您只需记住频繁(足够)使用Bufsock.flush()。TCP/IP保证以正确的顺序获得正确的字节。它不能保证你收到的块的大小。注意,如果你发送1024字节,1024字节,1024字节-那么没有什么可以阻止TCP将其分割成512字节,512字节,512字节,512字节,512字节-甚至是更奇怪的东西。它还保留聚合块的权利,以形成2048字节、1024字节 为了避免这种情况,重要的是在发送和接收之间建立一个循环,或者使用一些使bufsock或twisted更容易的方法。就我个人而言,我认为twisted使这更容易,但其他很多事情更难,但也许这只是因为我写了bufsock Bufsock在 在您的特定情况下,我看到您以ASCII格式发送长度,但我没有看到您向字段宽度发送任何类型的终止字符或填充。这将在连接的另一端造成严重破坏,在这里,它似乎假设长度始终为20个字符。要解决此问题,您可以:
s.send(str(limit) + '\n')
…但仍然存在缺少循环的问题。Bufsock为您执行循环,您只需记住频繁使用Bufsock.flush()(足够)。谢谢,我感谢您的回复。我现在正在尝试bufsock,还发现了一些其他(相当愚蠢的)错误,我正在纠正这些错误。缺少填充或结尾终止字符导致了非常有趣的结果,这就是我感到困惑的地方(例如,有时会给出“2048SQLite”)谢谢,我感谢您的回复。我现在正在尝试bufsock,还发现了一些其他(相当愚蠢的)错误,我正在纠正这些错误。缺少填充或结束字符导致了非常有趣的结果,这就是我感到困惑的地方(例如,有时会给出“2048SQLite”)