在开发项目中,遇到了这样的一个需求.服务端接受来自客户端的发送的视频,做图像处理与深度学习,不做消息广播,而是将结果通过web返回给用户.那么既然udp是面向无连接的,那么要如何知道数据报是哪个客户端发送的呢?
我在思考后给出如下思路:
方案一:
客户端先使用TCP登录服务器,连接成功后服务端拿到了客户端的ip地址及登录id.
客户端再尝试使用udp发送数据报,客户端根据拿到的数据报的ip地址就能知道是哪个用户发的
另外 服务端要使用心跳机制,保证当用户链接断开后能及时处理(因为客户端连接断开后tcp连接并不会及时断开)
方案二:
下面是一种多线程实现.tcp确保连接状态,每个udp线程服务一个客户端.
客户端先使用TCP登录,连接成功后服务端从一个固定端口如8000开始,查看此端口是否被占用,直到找见一个未被占用的端口后,服务端通知udp进程绑定端口号,只供这个客户端服务.即将UDP绑定端口号的操作DatagramSocket socket = new DatagramSocket(PORT) 放在多线程内.
之后服务端返回给客户端ip地址和端口号,客户端使用此ip地址和端口号做udp连接.
TCP始终保持连接,当tcp断开后服务端通知udp进程释放udp相应端口.同样在tcp内加入心跳机制,以保证客户端连接断开后tcp连接并不会及时断开
方案三:
token 不过这种方式我并不是很熟悉,就不多介绍了.
大家可以自己尝试实现一下.