基本上尝试使用客户端在屏幕上发送角色的坐标,然后将其广播到另一个客户端,以便在屏幕上绘制角色。 然而,我收到以下错误:
s.send((y))
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 :(得分:0)
您正试图取消收到的数据:
data = pickle.loads(data)
但是你在发送数据之前并没有腌制数据:
y = format(Cat.getPos())
s.send((y))
此外,您必须决定使用哪种序列化协议,因为pickle
和json
不兼容且此评论:
# Or json.loads(data)
表示您认为pickle
和json
都应该能够对收到的数据进行反序列化。
因此,您应该使客户端功能与此类似,而不是使用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_id
和message
个键,否则format(**data)
会抛出ValueError
,如果数据可以&如果在dict中缺少一个提到的键,则可以用作dict或KeyError
您还应该注意到我已将s.send((y))
替换为s.sendall(y)
,因为第一个并不能保证所有数据都会按照文档https://docs.python.org/2/library/socket.html#socket.socket.send发送
我还在y
附近删除了额外的括号 - 这不会改变任何内容,但不需要它们。
由于您只发布了部分代码,因此我只能解决发布的代码示例中出现的问题。