拜访【WRITE-BUG 数字空间】_[内附残缺源码和文档]
咱们抉择 Tcp 协定进行传输,之所以采纳 tcp, 首先是因为 tcp 传输稳固,相比于 udp 不稳固的传输,tcp 能确保音讯肯定传输进来。而后是 tcp 有服务器,相比于 p2p 无服务器模型,tcp 能够记录数据,不便用于商用而且也比拟平安。
次要设计思路:
咱们抉择 Tcp 协定进行传输,之所以采纳 tcp, 首先是因为 tcp 传输稳固,相比于 udp 不稳固的传输,tcp 能确保音讯肯定传输进来。而后是 tcp 有服务器,相比于 p2p 无服务器模型,tcp 能够记录数据,不便用于商用而且也比拟平安。
客户端次要设计思路:
基于 TCP 协定,实现发送音讯给服务器和从服务器接管音讯。要实现“迷你魔兽世界”客户端的根本框架次要分为以下几个局部:
指令,依据输出的指令,比方 login,move,attack 等,客户端要判断指令的无效 指令设计,输出指令 login playername,客户端向服务器发送登录申请,输出指令 move direction,客户端向服务器发送挪动申请,输出指令 attcak playername,客户端发送攻打另一位玩家的申请,输出指令 speak message,示意该玩家要发言,内容为 message,同样要向服务器发送申请,输出指令 logout,示意退出登陆。
有效指令,如果输出的不是约定好的指令以及指令构造不正确,则客户端不向服务器发送申请。第一,登陆时玩家名不能有空格;第二,move 指令前面的方向必须在 north,south,west 和 east 这几个方向中,如果为其余内容,则输入有效的方向的提醒;第三,输出 attack 指令后要判断被攻打玩家是否在该玩家视线范畴内,如果不在视线范畴内,则输入错误信息“The target is not visible”,玩家视线范畴为(x-5,x+5),(y-5,y+5),x 和 y 为玩家坐标;第四,speak 生成的数据中能够有空格;第五,logout 指令,没有参数。
发送申请,依据输出的无效指令失去音讯类型和音讯内容,依照协定打包成字节发送给服务器。
解决应答,客户端接管到来自服务器的包,依据协定,先解析出音讯类型,再依据不同音讯类型的包的构造解析出包中的数据,再依据这些数据输入音讯。
线程问题,客户端必须和服务器端进行异步通信。例如,当其余玩家生成一个 speak 命令,客户端将会收到 SPEAK_NOTIFY 信息从服务器端,只管客户端没有申请这个音讯。这意味着客户端不能阻塞用户的输出。所以将输出指令发送申请和接管播送 / 应答的函数设为两个线程,其中一个通过一个死循环,输出指令并解决,另一个也是通过死循环不停接管播送 / 应答并解决。
异样解决,当遇到一些非凡状况时须要做异样解决。
如果服务器端不可用并且连贯不能生成,客服端必须退出,且显示错误信息”The gate to the tiny world of warcraft is not ready.”。要实现这一点,须要通过 try/except 连贯地址和端口号的时候检测异样。
如果客户端从服务器端收到一个异样音讯,客户端必须退出,而后输入谬误音讯”Meteor is striking the world.”。即如果客户端收到的包的长度不符合规范,或者解析到的音讯类型不存在或与包的长度不匹配,阐明客户端收到了一个异样音讯。
如果客户端和服务器端的连贯被异常中断,客服端必须退出,而后显示一个谬误音讯”The gate to the tiny world of warcraft has disappeared.”。因为 python 中的套接字断开连接时不会出现异常,而是会一直接管到空字符,所以在接管音讯的中央做一个判断,如果接管到的音讯长度为 0,阐明连贯断开,则执行该异样解决。