当前位置: 首页 > 知识库问答 >
问题:

Python连接的数据报套接字

太叔京
2023-03-14

我正在构建一个简单的客户端-服务器多人游戏,我想连接UDP套接字。但是,当我调用listen()方法时,它会生成操作不受支持的异常

try:
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server.bind((host, port))
    server.listen(5)
except socket.error, (value, message):
    print "E: " + message  # E: Operation not supported

有没有连接数据报套接字的方法?


共有1个答案

燕昊东
2023-03-14

UDP协议是无连接的,因此您确实无法以与TCP客户端和服务器相同的方式在两个套接字之间创建连接;因此,您也不能在UDP套接字上执行listen系统调用,因为它只涉及TCP服务器套接字。而是使用socket。recvfrom从任何地址接收数据报:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
data, addr = sock.recvfrom(65536)  # this will fit the maximum datagram

您可以通过对套接字的主机、端口元组的addr进行分解来响应客户端(如果它们仍然有一个套接字打开)。AF_INET插座。SOCK_DGRAM

client_host, client_port = addr

你可以发送数据回那里与sendto

sock.sendto(data, (client_host, client_port))

如果您想使用一个众所周知的端口,您将绑定套接字;如果没有,系统将为您分配一个端口。

在许多套接字实现中,可以使用数据报套接字执行连接系统调用;这是一种过滤器,用于删除来自不需要的源的数据包,并用于设置sock的默认传出地址。发送(在这样的套接字上使用sock.sendto发送到另一个地址仍然可以,尽管响应可能会因为“连接”而被删除)。如果两个节点同意彼此使用两个众所周知的端口,则这在客户端或两个节点之间非常有用。

但是,如果您在服务器上执行connect,它将无法在此套接字上处理任何其他请求。另外,listen及其队列仅与SOCK\u流sockets相关。

因此,在许多客户端到一个服务器的情况下,您可以让服务器监听套接字12345,当客户端与服务器联系时,服务器可以从server: 12345发出包含另一个端口号的消息客户端应与服务器一起使用。

 类似资料:
  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 问题内容: 该服务器的行为类似于回显服务器。客户端向服务器发送10个数据包(间隔为1秒) 当客户端从服务器接收数据包时,有时数据包会丢失。 因此,客户端必须等待一秒钟,直到数据包到达。如果数据包未在1秒钟内到达,则客户端应继续发送其他数据包。 我将如何使用.setSoTimeout实现此目的? } 问题答案: setSoTimeout的Javadoc说: 将此选项设置为非零超时后,对此Datagr

  • 当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。

  • 问题内容: 我正在尝试为python中的类编写单元测试。该类在 init 上打开一个tcp套接字。我试图对此进行模拟,以便可以断言使用正确的值调用了连接,但是显然在单元测试中实际上并未发生。我已经厌倦了MagicMock,补丁程序等,但是还没有找到解决方案。 到目前为止我的班级看起来像 问题答案: 如果您只想断言被正确调用,这很简单 如果必须先导入模块才能访问,则需要稍微调整补丁:

  • 我在Python中使用套接字制作聊天应用程序,但当我尝试从不同的计算机连接时,它会说: C:\用户\James\OneDrive\Documents\Python\Projects\Gui聊天\client.pyw[WinError 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应 这是套接字的服务器代码: 我还有一个循环接受所有请求: 在客

  • 我试图通过Windows服务从套接字接收数据,但当我建立连接时,它会立即生效。我希望不断地接收它(当端口关闭时,它将断开连接)。我怎样才能做到这一点? 这是我现在的输出; “GET/HTTP/1.1 主持人:127.0.0.1:1994 连接:保持活力 缓存控制:最大年龄=0 升级-不安全-请求: 1 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)Apple