Python套接字 - 使用坐标getPos

时间:2014-04-30 12:05:48

标签: python sockets

基本上尝试使用客户端在屏幕上发送角色的坐标,然后将其广播到另一个客户端,以便在屏幕上绘制角色。 然而,我收到以下错误:

  1. 客户端:s.send((y))
  2. 服务器端:ValueError: invalid literal for long() with base 10
  3. 我收到错误的客户端代码:

    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)
    

1 个答案:

答案 0 :(得分:0)

您正试图取消收到的数据:

data = pickle.loads(data)

但是你在发送数据之前并没有腌制数据:

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

此外,您必须决定使用哪种序列化协议,因为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恢复了类Cat的对象,但它不能如果此类的定义不可用,则完成 - Cat.getPos()返回一个dict(或类似词典的对象),其中包含message_idmessage个键,否则format(**data)会抛出ValueError,如果数据可以&如果在dict中缺少一个提到的键,则可以用作dict或KeyError

您还应该注意到我已将s.send((y))替换为s.sendall(y),因为第一个并不能保证所有数据都会按照文档https://docs.python.org/2/library/socket.html#socket.socket.send发送 我还在y附近删除了额外的括号 - 这不会改变任何内容,但不需要它们。

由于您只发布了部分代码,因此我只能解决发布的代码示例中出现的问题。