使用添加字符的套接字接收数据

时间:2015-07-03 16:45:43

标签: sockets python-3.x

我正在为游戏编写一个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])

为什么会看到这些额外的角色?什么是最有效的方法来删除它们/阻止它们?

干杯。

2 个答案:

答案 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)

您需要检查收到的数据量,并确保在收到的数据末尾字符串为空终止,否则您将解析随机数据。

为了可靠性,您应该发送一个固定长度的消息,告诉客户端需要多少数据。然后,客户端可以确保它接收所有已发送的数据,而不再发送。