2015-07-03 76 views
0

我正在写一个模拟游戏来允许我使用第二个屏幕和一组统计数据。现在我发送数据并接收数据,但是当我收到数据时会有额外的字符,例如''。这导致问题阻止我创建一个int变量。我试过剥去这些角色,但仍然有问题。这是错误吐出来: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() 

而且客户端,这对错误:??

​​

为什么看到这些额外的字符,什么是删除它们最有效的方法/阻止他们

干杯

回答

0

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

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

+0

右,确定...我怎么会去那? – Jam3sn

+0

看看https://docs.python.org/2/howto/sockets.html#using-a-socket – ravenspoint

+0

非常感谢。我已经通读了一遍,这是有道理的。我唯一没有得到的是如何在接收时确定MSGLEN。我们如何找到这里使用:'while bytes_recd Jam3sn

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