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连接的数据报套接字_Python_Sockets_Python 2.7_Udp - Fatal编程技术网

Python连接的数据报套接字

Python连接的数据报套接字,python,sockets,python-2.7,udp,Python,Sockets,Python 2.7,Udp,我正在构建一个简单的客户端-服务器多人游戏,我想连接UDP套接字。但是,当我调用listen()方法时,它会生成操作不受支持的异常 试试看: 服务器=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind((主机、端口)) 服务器。听(5) 除了socket.error(值、消息): 打印“E:+消息#E:不支持操作 有没有连接数据报套接字的方法?UDP协议是无连接的,因此您确实无法以与TCP客户端和服务器相同的方式在两个套接字之

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

试试看:
服务器=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind((主机、端口))
服务器。听(5)
除了socket.error(值、消息):
打印“E:+消息#E:不支持操作

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

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
您可以通过对
socket.AF_INET
socket.SOCK_DGRAM
主机、端口
元组的
addr
进行分解来响应客户端(如果它们仍然有一个打开的套接字)

client_host, client_port = addr
您可以使用
sendto

sock.sendto(data, (client_host, client_port))
如果您想使用知名的端口,您将
绑定
套接字;如果没有,系统将为您分配一个端口


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

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


因此,在多个客户端连接到一台服务器的情况下,您可以让服务器监听socket
12345
,当客户端与服务器联系时,服务器可以从
server:12345
响应一条消息,其中包含客户端应与服务器一起使用的另一个端口号。

我不确定您是说数据报套接字不能在python中连接,还是一般情况下连接。当然,即使不常见,UDP套接字仍然可以连接。例如,请参阅第2.1节:“数据报套接字有时称为“无连接套接字”。(如果您真的需要,它们可以是connect()'d)。”我的问题是如何实现连接的UDP套接字。我应该让客户端尝试连接到不同范围的已知端口吗?如果是这样,我应该如何告诉服务器在这样的范围内监听?我对多个连接使用线程,因此,原则上,不为其他请求提供服务没有问题。因此,在服务器端连接的正确方法是从(32)
获取消息
msg,addr=s.recvfrom(32)
,最终解析它,并执行
server.connect(addr)
?类似的操作。如果有更多的问题,你应该问一个新问题