2014-04-30 40 views
-2

基本上嘗試使用客戶端發送屏幕上的字符的座標,然後播出到其他客戶端,以便它在屏幕上繪製的字符。 然而,我發現了以下錯誤:Python的插座 - 使用座標GETPOS

  1. 客戶端:s.send((y))
  2. 服務器端:ValueError: invalid literal for long() with base 10

客戶端的代碼,我得到錯誤:

def updatecoords(task): 
    s.send(name) 

    print 'Name sent...' 


def updatepos(task): 
    y = format(Cat.getPos()) 
    s.send((y)) 
    print 'Position sent' 


    return Task.cont 
def readServer(task): 
    try: 
     data = s.recv(1024) 
     print data 
    except: 
     print 'no data received' 
    return Task.cont 

服務器代碼我得到的錯誤:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.bind((HOST,PORT)) 
server_socket.listen(1) 
conn, addr = server_socket.accept() 
print('Someone connected.He :%s%addr') 
while True: 

    data = conn.recv(1024) 
    if not data: 
     break 
    data = pickle.loads(data) # Or json.loads(data) 
    print "Got id: {message_id}, data: {message}".format(**data) 
+0

您還沒有發佈的回溯,但我是對的,如果我說的錯誤是行'數據= pickle.loads(數據)#或者json.loads(數據)'? – ElmoVanKielmo

+0

請發佈追蹤和客戶端和服務器的完整代碼。 – gravetii

+0

你在客戶端中使用某種全局套接字對象嗎?你似乎也相信每次你從套接字讀取數據,你都會得到所有的數據。這很少是真實的,你應該*總是*確保你得到*全部*的數據。 – msvalkon

回答

0

您正在嘗試unpickle接收到的數據:

data = pickle.loads(data) 

但你是不是在發送之前酸洗數據:

y = format(Cat.getPos()) 
s.send((y)) 

而且你必須決定你wan't其系列化協議使用,因爲picklejson不兼容,此評論:

# Or json.loads(data) 

建議您認爲picklejson應該能夠反序列化接收到的數據。的

因此,而不是使用format你應該讓你的客戶端功能與此類似:

def updatepos(task): 
    y = pickle.dumps(Cat.getPos()) 
    s.sendall(y) 
    print 'Position sent' 

但還是這個服務器代碼:

data = pickle.loads(data) 
print "Got id: {message_id}, data: {message}".format(**data) 

將只在兩個條件:
- 類Cat在服務器端被導入,否則pickle.loads會拋出UnpicklingError,因爲pickle協議保留了類名,而unpickling恢復了01類的對象但它不能這樣做,如果這類的定義是不可用
- Cat.getPos()返回dict(或類似字典的對象)與鍵message_idmessage,否則format(**data)將拋出ValueError如果數據不能被用作字典或KeyError如果提到的關鍵之一在字典

缺少你也應該注意到,我把它換成s.send((y))s.sendall(y)因爲第一個並不能保證所有的數據將作爲文件被髮送說https://docs.python.org/2/library/socket.html#socket.socket.send 我也在y附近放棄了額外的括號 - 這不會改變任何東西,但它們會不需要。

正如你已經張貼只有你的代碼的一部分,我才能夠解決目前所張貼的代碼示例中的問題。

+0

非常感謝。這擺脫了那個錯誤。但是,我得到另一個錯誤,這是不同的,但沒有告訴我在代碼中的位置。 1)服務器端錯誤=沒有名爲libpanda的模塊。 2)客戶端錯誤:返回getattr(self._sock名稱)(* args)。我在移動ATM,但會發布代碼,當我到我的電腦 – Simpson

+0

由於這些是不同的問題,最好你應該發佈它作爲另一個問題。隨時在評論中發佈新問題的鏈接 - 我會看看,然後嘗試幫助你。 – ElmoVanKielmo

+0

是的,在這裏:http://stackoverflow.com/questions/23391929/python-sockets-return-getatt-self-sock-nameargs – Simpson