Как работать с клиентами сокетов UDP в python - PullRequest
1 голос
/ 27 апреля 2020

в сокетах TCP вы связываете, затем принимаете соединения с помощью s.accept (), но в сокете UDP вы просто связываете сервер, и любой подключается (если я ошибаюсь, поправьте меня), так как управлять клиентами, как, например, если 5 клиентов подключаются к сервер закрывает сервер или, если кто-то подключается к серверу, отправляет ему сообщение «Добро пожаловать на сервер». Спасибо за любые ответы.

1 Ответ

0 голосов
/ 27 апреля 2020

По определению, UDP не имеет понятия «сессий», поэтому он не будет знать, сколько он в данный момент обрабатывает.

Вам нужно будет реализовать какое-то управление сессиями в своем коде, чтобы решить, когда клиент активен или неактивен, и для этого нужно выполнить действие.

Ниже приведен пример кода, в котором должно быть разрешено до пяти клиентов и срок его действия истекает через тридцать секунд.

bind_ip = '192.168.0.1' ## The IP address to bind to, 0.0.0.0 for all
bind_port = 55555 ## The port to bind to
timeout = 30 ## How long before forgetting a client (seconds)
maximum = 5 ## Maximum number of clients

###
import socket
import time

## Create the socket as an internet (INET) and UDP (DGRAM) socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

## Bind to the server address and port
sock.bind((bind_ip, bind_port))

## Make a dict to store when each client contacted us last
clients = dict()

## Now loop forever
while True:
    ## Get the data and the address
    data, address = sock.recvfrom(1024)

    ## Check timeout of all of the clients
    for addr in clients.keys():
        ## See if the timeout has passed
        if clients[addr] < (time.time() - timeout):
            ## Expire the client
            print('Nothing from ' + addr + ' for a while. Kicking them off.')           
            clients.pop(addr)

    ## Check if there are too many clients and if we know this client
    if len(clients.keys()) > maximum and address not in clients.keys():
        print('There are too many clients connected!')
        continue    

    ## Update the last contact time
    clients[address] = time.time()

    ## Do something with the data
    print('Received from ' + str(address) + ': ' + str(data))           

Это ни в коем случае не самый эффективный способ сделать это, и служит только примером.

Связанное чтение: https://en.wikibooks.org/wiki/Communication_Networks/TCP_and_UDP_Protocols/UDP

...