我正在尝试通过python中的持久TCP连接传输多个图像。据我所知,此代码应该可以正常工作,但有时会显示以下错误ValueError:int()的无效文字,基数为10:'6789:'
对于每个图像,我首先尝试将该图像的大小发送给客户端。
有人可以帮我解决我做错的事情吗,或者以其他方式指导如何做
服务器代码
import socket
import time
import os
port = 6004
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname() # Get local machine name
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
print ('Server listening....')
conn, addr = s.accept()
print ('Got connection from', addr)
# data = conn.recv(1024)
# print('Server received', repr(data))
start =time.time()
for i in range(2):
filename="sc" + str(i) + ".jpg"
size = str(os.path.getsize(filename))
try:
conn.send(size.encode())
except:
print('ckckckckckck')
print('filesize', size, len(size))
f = open(filename,'rb')
current=0
size = int(size)
while current <size:
l = f.read(1024)
conn.send(l)
current+=len(l)
print('current',current)
print('l',len(l))
if(current==size):
break
print('close current',current)
f.close()
print('Done sending')
conn.send(b'Thank you for connecting')
#conn.close()
print(time.time()-start)
客户代码
import os
import socket
import time # Import socket module
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Create a socket object
host = socket.gethostname() # Get local machine name
port = 6004 # Reserve a port for your service.
s.connect((host, port))
s.send(b'Hello server!')
for i in range(2):
data = None
data = s.recv(1024)
data = data.decode()
size = int(data)
print(size)
filename = "sc" + str(i) + ".jpg"
f = open(filename,'wb')
current =0
while current<size:
data = s.recv(1024)
f.write(data)
current+=len(data)
# print('data',len(data))
# print('current',current)
if(current==size):
break
print('close current',current)
f.close()
print('Successfully get the file')
s.close()
print('connection closed')
答案 0 :(得分:1)
data = s.recv(5)
您希望大小在前5个字节以内,并且希望使用一个recv
来获取。但是,实际大小可以小于5个字节或更多,因为您在发送时不执行特定的字节数:
conn.send(size.encode())
因此,这里可能发生的情况是您在客户端中读取的大小太小(如果原始大小较大),或者使用的大小小于5个字节,并且文件内容中已有5个以内的数据您读取的字节。这会导致您看到错误。
请注意,TCP是字节流协议,而不是消息协议,这意味着您send
不一定是您recv
。相反,可以在一个send
中读取来自多个recv
的数据,或者单个send
可能需要多个recv
。因此,对代码进行更好的设计将确保在尝试将数据解释为长度之前,始终为该长度写一个固定的长度,并始终确保它具有完整长度。