[英]TCP Server/Client: [Errno 32] Broken pipe
我正在尝试使用 python 为一个小游戏创建一个简单的多人游戏模式。我想要做的是共享连接到服务器的每个玩家的 position。 现在,尽管我一直在努力让一个客户端与服务器通信,使用套接字模块和 json 文件(虽然这似乎不会引起问题)。
我得到的错误和时间:
一旦我第二次尝试通过客户端发送内容,我就会收到“[Errno 32] Broken pipe”错误。 根据一些谷歌搜索,当连接关闭时会发生这种情况。 不幸的是,我看不到它在哪里关闭。
目前我的代码几乎是这样的: http://thomasfischer.biz/python-simple-json-tcp-server-and-client/ 。 自从我立即遇到这个问题后,我并没有做太多改变。
服务器客户端:
import SocketServer
import json
class MyTCPServer(SocketServer.ThreadingTCPServer):
allow_reuse_address = True
class MyTCPServerHandler(SocketServer.StreamRequestHandler):
def handle(self):
try:
data = json.loads(self.request.recv(1024).strip())
print data
except Exception, e:
print "Exception wile receiving message: ", e
server = MyTCPServer(('127.0.0.1', 13373), MyTCPServerHandler)
server.serve_forever()
玩家客户端:
import SocketServer
import json
def __init__(self):
self.S = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.S.connect(('127.0.0.1', 13373))
*lots of game related code*
pos = {'id':id, 'pos': (x, y, z)}
self.S.send(json.dumps(pos))
self.position = (x, y, z)
if __name__ == '__main__':
main() #to keep the game running and updating
错误:
File "/usr/local/lib/python2.7/dist-packages/pyglet/app/__init__.py", line 123, in run
event_loop.run()
File "/usr/local/lib/python2.7/dist-packages/pyglet/app/base.py", line 135, in run
self._run_estimated()
File "/usr/local/lib/python2.7/dist-packages/pyglet/app/base.py", line 164, in _run_estimated
timeout = self.idle()
File "/usr/local/lib/python2.7/dist-packages/pyglet/app/base.py", line 273, in idle
redraw_all = self.clock.call_scheduled_functions(dt)
File "/usr/local/lib/python2.7/dist-packages/pyglet/clock.py", line 309, in call_scheduled_functions
item.func(ts - item.last_ts, *item.args, **item.kwargs)
File "/home/tim/tools/Pyglet/PlayerClient.py", line 609, in update
self._update(dt / m)
File "/home/tim/tools/Pyglet/PlayerClient.py", line 641, in _update
self.S.send(json.dumps(pos))
socket.error: [Errno 32] Broken pipe
当连接的一端尝试发送数据而另一端已经关闭连接时,会发生Broken Pipe。
self.S.send(json.dumps(pos))
在尝试上述操作时,服务器已关闭连接。 可能在*lots of game related code*
和客户端TCP知道这一点。但客户端应用程序不是。 检查tcpdump b / w客户端和服务器。 您应该从服务器看到FIN或RST。
您需要具有捕获应用程序代码中的FIN / RST等TCP事件的机制。 不应该使用捕获异步TCP事件的机制编写TCP应用程序。
而且一般来说谈论矩阵也更容易。 感觉更自然。 例如,说“我将第一个矩阵的行数增加了一倍”对每个人都有意义(并且您立即知道该算法的运行速度大约是原来的两倍,“我将两个矩阵的两个维度都增加了一倍”是有意义的。但是说“我的元素数量增加了一倍”会让任何人感到困惑,矩阵之后会是什么样子。你是否将两个维度都增加了 1.41 倍?矩阵是否改变了形状?或者发生了什么?它有什么影响在运行时...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.