我为我的在线游戏制作了一个服务器(python,twisted)。从TCP开始,然后用UDP增加了持续更新(速度有了很大的提高)。但是现在,我需要将每个UDP套接字客户端连接到每个TCP客户端。在
我的方法是让每个客户端首先连接到TCP服务器,并获得一个唯一的ID,然后客户端将此ID发送到UDP服务器,并将其连接起来。然后我有一个TCP客户端的主列表(按惟一ID排序)。在
我的目标是能够通过TCP和UDP向同一个客户端发送消息。
将UDP和TCP套接字链接到同一个客户端的最佳方法是什么?在
我可以只获取新TCP客户端的IP地址,然后通过UDP将数据发送到该IP吗?或者客户端需要连接两次,一次用于TCP,一次用于UDP(通过发送“connect”消息)?在
最后,如果有人知道TCP/UDP可以告诉我(我是新来的!),当通过UDP与TCP(从同一台机器)连接时,同一个客户机是否具有相同的IP地址?(我需要知道这一点,以保护我的服务器,但我不想意外地阻止一些公平的用户)
1-我可以只获取一个新的TCP客户端的IP地址,然后通过UDP将数据发送到该IP吗?一般情况下没有,但是。。。在
2-客户端是否需要连接两次,一次用于TCP,一次用于UDP?不,肯定的
3-当通过UDP与TCP(从同一台机器)连接时,同一个客户机是否具有相同的IP地址?除特殊情况外
你真的需要一些关于TCP、UDP和IP协议的基本知识,才能在OSI模型上更进一步。在
基础知识(但你应该阅读维基百科上的文章,以获得更深入的理解):
事实上,最严重的问题是客户机和服务器之间是否有网关。虽然客户机和服务器是两台(虚拟)机器,您可以直接通过键盘访问,这没问题,但企业网络通常由防火墙保护,充当NAT,许多国内ADSL路由器还包括防火墙和NAT。那样的话就忘了UDP。可以指示国内路由器将所有UDP通信量传递到单个本地IP,但这并不一定是一项容易的工作。另外,这意味着,如果你的用户在家里有多台机器,他一次只能使用一台,并且必须重新配置路由器才能切换到另一台!在
首先,当你用TCP或UDP发送数据时,你必须给出端口。在
如果您的客户端使用TCP连接,并且在服务器使用UDP发送响应后,客户端将拒绝该数据包。在
为什么?因为您必须注册一个用于连接的端口,并且您不能确定该端口在客户端上是否正确打开。在
因此,当您在TCP中开始连接时,客户机打开一个端口来发送数据并接收响应。你必须用UDP做同样的事情。当客户端开始与服务器进行所有通信时,您可以确保所有必需的端口都已打开。在
别忘了在连接打开的端口上发送数据。在
为什么不想创建2个连接? 例如,你必须使用UDP进行移动。因为如果你创建一个FPS,你可以每50ms发送一次播放器的位置,所以使用UDP非常重要。在
这不仅仅是一个更好联系的问题。如果你想在客户机和服务器之间有一个真正好的连接,你需要使用异步连接和使用流。但是如果你使用流,你的TCP套接字不会发出套接字结束的信号,但是你有更好的传输。所以你必须写一些东西来显示包的结尾(例如
<EOF>
)。 但你对此有意见。接收到的每个套接字都必须分析数据并在<EOF>
上拆分。它需要很多处理器。在使用UDP时,数据包总是有一个结束信号。但你需要实施安全检查。在
回答你最后一个问题:不,因为:
你的方法似乎是解决这个问题的好办法。在
相关问题 更多 >
编程相关推荐