Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python客户端服务器UDP应该如何工作?_Python_Sockets_Udp - Fatal编程技术网

Python客户端服务器UDP应该如何工作?

Python客户端服务器UDP应该如何工作?,python,sockets,udp,Python,Sockets,Udp,我有一个客户端-服务器“蛇”游戏,可以很好地使用TCP连接,我想尝试一下UDP方式 我想知道它应该如何使用?我知道UDP是如何工作的,如何制作一个简单的ECHO示例,但我想知道如何执行以下操作: 例如,对于TCP,服务器每间隔(1/15秒)向客户端发送一个新的蛇头位置 使用UDP,我是否应该执行以下操作: 客户端: client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) serverAddr = (('localhost', PORT)

我有一个客户端-服务器“蛇”游戏,可以很好地使用TCP连接,我想尝试一下UDP方式

我想知道它应该如何使用?我知道UDP是如何工作的,如何制作一个简单的ECHO示例,但我想知道如何执行以下操作:

例如,对于TCP,服务器每间隔(1/15秒)向客户端发送一个新的蛇头位置

使用UDP,我是否应该执行以下操作:

客户端:

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddr = (('localhost', PORT))
while 1:
    client.sendto('askForNewHead', serverAddr)
    msg, addrServer = client.recvfrom(1024)
    game.addPosition(msg)
服务器端:

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((HOST, PORT))
while 1:
    data, addr = server.recvfrom(1024)
    server.sendto(headPosition, addr)
所以在这里,客户机必须要求服务器获取新的头部位置,然后服务器发送答案。我设法做到了这一点,但我不知道这是否是一个好的方法


看起来很奇怪,客户端必须请求udp更新,而使用我的TCP连接,客户端只需等待直到收到消息。

udp与TCP不同,我相信使用python时,客户端确实必须请求服务器更新。
虽然学习和使用不同的internet通信方式很有趣,但对于python,我真的建议您坚持使用TCP。

您不必要求服务器进行更新。但由于UDP连接较少,服务器可以发送头部位置而无需询问。但是客户端应该向服务器发送i'm-alive-packets,但这可能每10秒左右发生一次。

TCP和UDP之间存在差异,但不是您描述的方式。与TCP一样,客户机可以recvfrom从服务器获取消息,而无需每次请求新数据。区别在于:

  • 使用TCP,初始连接包括客户端和服务器之间的数据包交换。除非客户机套接字已绑定到IP和端口,否则它将绑定到客户机IP并分配空闲端口。由于客户机和服务器之间的握手,服务器知道在哪里联系客户机,因此可以向数据包发送数据,而无需事先从客户机获取数据
  • 使用UDP时,没有初始握手。除非已经绑定,否则套接字将在向服务器发送第一个数据包时绑定到客户端IP和空闲端口。只有在接收到该数据包时,服务器才知道客户端的IP和端口,并可以将数据发送回
也就是说,你不需要一直“问”什么时候起床。相反,客户机必须只向服务器发送一个数据包,以便服务器知道未来所有数据包的发送位置

但TCP和UDP之间还有其他重要区别:

  • 使用UDP时,数据包可能会丢失或以不同的顺序到达。使用TCP,您可以保证交付
  • 使用UDP时,没有真正的连接,只有两个对等方之间的数据包交换。有了TCP,你就有了连接的开始和结束。这与防火墙或路由器中的数据包过滤器有关,后者通常需要维护连接的状态。由于UDP没有连接结束,数据包过滤器将只使用一个简单的超时,通常低至30秒。因此,如果客户机在家庭网络中被动地等待来自服务器的数据,那么如果包过滤器由于超时而关闭状态,它可能会永远等待。为了解决这个问题,必须定期传输数据,以便状态不会超时

人们经常会发现这样的论点,即UDP比TCP快。这显然是错误的。但是,如果数据包丢失,您可能会看到延迟问题,因为TCP会注意到数据包丢失并再次发送数据包,同时还会降低传输速度以减少数据包丢失。使用UDP,您必须自己处理数据包丢失和其他拥塞问题。有些情况下,如实时音频,可以释放一些数据包,但低延迟很重要。这些情况下UDP是好的,但在大多数其他情况下TCP更好。

动机是我想尝试更快的东西,因为它是基于速度/实时的游戏。TCP拥塞造成的“延迟”很少,一小时内可能出现10次。你试过了吗?编辑:UDT意味着一个链接,虽然在我的显示器上我看不太清楚。TCP的这些“滞后”是你用UDP来释放数据包的地方。除非你有防火墙之类的东西,在客户端和服务器之间有状态数据包转发规则,客户端无需向服务器发送UDP数据包即可从服务器获取UDP数据包。i、 e.除非有任何干扰,交通流相互独立。注意(与TCP一样)recvfrom()默认情况下会阻塞,直到收到数据包;这可能与你的问题有关。您可以通过将套接字设置为非阻塞模式或使用select()实现超时来避免这种情况。