2015-07-03 40 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'))