我正在为大学项目创建一个游戏服务器,所以我在不使用任何库/框架的情况下这样做。
经过大量研究后,我希望客户端和服务器使用UDP协议进行大量的通信,如角色移动和定时器,因为游戏这方面的可靠性并不那么重要,丢失的数据包可以得到补偿
但我也希望将TCP协议用于游戏的其他方面,例如操作和事件,其中信息到达客户端至关重要。
我的问题是我对使用UDP一般和Java都不太了解,根据我的理解,它与仅具有TCP的开放Socket对象完全不同。我认为客户端和服务器之间的初始连接将由TCP完成,然后一旦建立此连接,服务器是否应该将端口号发送回客户端将通过UDP与服务器通信的客户端? / p>
这让我想到了拥有多个客户端的问题,他们是否都需要分配不同的端口号才能通过UDP连接到服务器?那么服务器将为每个连接的客户端提供1个不同的端口号?
我对服务器的计划是为每个客户端连接1个发送线程和1个接收线程 - 我是否能够在每个线程中处理TCP和UDP通信,或者每个客户端需要4个线程tcp为2,udp为2?
这些只是我的第一个想法,我不太了解UDP,所以很抱歉,如果我有完全错误的结束!谢谢,如果有人可以帮助解决这些问题!
答案 0 :(得分:1)
服务器是否应该向客户端发送一个端口号,客户端将通过UDP与服务器通信?
您可以执行此操作,也可以从属性文件中加载它。取决于您的实施。
是否需要为多个客户端分配不同的端口号以通过UDP连接到服务器?那么服务器将为每个连接的客户端提供1个不同的端口号?
没有。服务器可以区分数据包所属的客户端与收到的数据报(UDP)数据包上的IP地址。
我是否能够在每个线程中处理TCP和UDP通信,或者每个客户端需要4个线程,其中2个用于tcp,2个用于udp吗?
您不需要单独的线程来发送数据,因为这不会导致线程阻塞。只有接收才会导致线程被阻塞,因此您的客户端程序只需要2个通信线程;一个接收TCP,另一个接收UDP通信。
注意:Java确实以完全不同的方式处理TCP和UDP通信。 TCP是您写入的流(它会自动处理握手和数据包丢失),而UDP使用填充了字节并发送的DatagramPacket对象。