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