Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将python套接字流字符串值转换为浮点值?_Python_Sockets_Tcp - Fatal编程技术网

如何将python套接字流字符串值转换为浮点值?

如何将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

我开始使用套接字发送文件。我了解到我可以通过套接字流发送1024个“块”,然后在服务器端将其分回来。我将服务器设置为首先获取一个字符串,该字符串包含它将接收的文件的大小,并在读取时进行比较,以查看读取是否完成

客户端代码为:

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”)