我正在为游戏编写一个mod,允许我使用带有一组统计数据的第二个屏幕。现在我发送数据并接收,但是当我收到数据时会有额外的字符,例如,' )。这导致问题阻止我创建一个int变量。我试过剥离这些角色,但仍然遇到问题。这是错误spat out:ValueError:int(*)的无效文字,基数为10:"(0'"
这是我发送的内容:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.0.2'
port = 9000
s.bind((host,port))
s.listen(5)
conn, addr = s.accept()
print ('Got connection from', addr)
while True:
#--- RPM --
rpm = info.physics.rpms
max_rpm = info.static.maxRpm
if rpm != 0:
rpm_percent = int(rpm/max_rpm*100)
else:
rpm_percent = 0
#--- SPEED ---
speed = int(info.physics.speedKmh/1.609344)
#--- GEAR ---
gear = info.physics.gear - 1
if gear == 0:
gear = str("N")
elif gear < 0:
gear = str("R")
#--- FUEL ---
fuel = info.physics.fuel
max_fuel = info.static.maxFuel
if fuel != 0:
fuel_percent = int(fuel/max_fuel*100)
else:
fuel_percent = 0
#--- BRAKING ---
brake = info.physics.brake
braking_lvl = int(brake/100*10000)
#--- LAP ---
current_time = info.graphics.currentTime
#--- SEND DATA ---
time.sleep(.1)
#print_data = 'Speed: ', speed, 'RPM: ', rpm_percent, 'Gear: ', gear, 'Braking: ', braking_lvl, 'Fuel: ', fuel, fuel_percent,'Lap Time: ', current_time
send_data = (speed, ';', rpm, ';', rpm_percent, ';', gear, ';', braking_lvl, ';', fuel, ';', fuel_percent)
conn.send(str(send_data).encode('ascii'))
print(send_data)
s.close()
在客户端上,有错误:
data = s.recv(1024).decode('ascii').replace(' ', '').replace("'", '').replace(')', '').replace(',', '')
data = data.split(';')
speed = int(data[0])
rpm = int(data[1])
rpm_percentage = int(data[2])
gear = str(data[3])
breaking_lvl = int(data[4])
fuel = int(data[5])
fuel_percentage= int(data[6])
为什么会看到这些额外的角色?什么是最有效的方法来删除它们/阻止它们?
干杯。
答案 0 :(得分:1)
send_data
是一个元组。如果你致电str()
;它返回其字符串表示形式'(item, item)'
。要阅读它,您需要eval()
或ast.literal_eval()
(在简单情况下)。你可以使用json格式。
在服务器上:
sock.sendall(json.dumps(data).encode('utf-8'))
在客户端上(假设在收到服务器的响应后连接已关闭):
response = []
while True:
chunk = sock.recv(1024)
if not chunk: # EOF
break
response.append(chunk)
data = json.loads(b"".join(response).decode('utf-8'))
答案 1 :(得分:0)
您需要检查收到的数据量,并确保在收到的数据末尾字符串为空终止,否则您将解析随机数据。
为了可靠性,您应该发送一个固定长度的消息,告诉客户端需要多少数据。然后,客户端可以确保它接收所有已发送的数据,而不再发送。