【发布时间】:2013-08-08 23:18:52
【问题描述】:
我有一个关于在网络游戏中对客户端/服务器通信进行编程的一般性问题。 我使用 TCP 作为协议,并且通信......有效,但我不确定它是否是一种有效的方式。
一般来说,发生在客户端的动作都会经过所有这些步骤:
- 一些动作(例如,一个火球被施放)
- [*]对于这个动作,我定义了一个字符串(例如#F#270#130#,这意味着“F”表示它是一个火球,而 270 是(例如)角度的度数,130 -射击的火球的速度。)
- 字符串进入客户端的 outputpuffer 和等待队列
- 字符串已发送
- 服务器接收到字符串
- [*] 服务器需要一个可以检测字符串含义的行解释器(这里:F 是什么意思?它是一个火球!)并添加一个唯一标识,基于从哪个客户端接收命令。李>
- [*]服务器需要根据发生的动作计算逻辑(火球对某人造成伤害,它是(立即)击中某人还是先飞?)
- 服务器向所有客户端发送一个(更新的)操作字符串。 (例如,可能由于某种原因火球的速度变慢了 - 这里将更新字符串(#F#12345#270#90# - 12345 是唯一的玩家身份)
- 客户端接收字符串
- [*] 客户端将字符串解析为命令 + 处理它(触发动画序列...)
- 最初发送命令的客户端将接收到的字符串与waitingqueue中的字符串进行比较 - 当相等时,什么都不做(平滑一些动作,否则由于连接问题/延迟,一些动作会发生两次或从一个位置跳转到另一个位置,基于ping
真的有必要完成所有这些步骤吗?在标有 [*] 的所有步骤中,我需要为每个命令定义新的 lineinterpreters/action,因此我将每个操作编码两次,客户端和服务器端。 我读过一些关于发送可序列化对象的文章,但总的来说,这个想法对我来说似乎是一样的,我发送一个对象,它必须被解释+处理,然后我发回一个对象......
有什么提示吗?用更少的编码解决整个通信更优雅?或者更有序 - 所有这些用于不同操作的 #F# #M# #H# 标记使其变得越来越复杂:)
(事实上,我实际上有以下处理程序/操作:
-移动 -看/旋转 -hpchange -火箭 -spawn/断开连接 ...)
希望你明白我的意思 - 我知道,我可以继续这样编码,它会以某种方式工作,但它似乎太复杂了。
谢谢!
【问题讨论】:
-
还有更多:) 发送字符串,传输字节到服务器,服务器接收字符串,以及其他你没有提到的100个步骤
标签: java tcp client communication serializable