Программа клиент/сервер Python UDP, проблемы

Я пытаюсь написать базовую эхо-программу клиент/сервер, чтобы протестировать использование таймеров для повторной передачи на основе select() (хотя мне пришлось закомментировать этот бит, чтобы упростить отладку, когда он не работал должным образом) Вот фрагменты соответствующего кода:

Сервер:

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", address)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, address)

Клиент:

from socket import *
import sys
import select

address = ('localhost', 6005)
client_socket = socket(AF_INET, SOCK_DGRAM)

num_retransmits = 0
while(num_retransmits < 60):
    num_retransmits = num_retransmits + 1


    data = "Request 1"
    client_socket.sendto(data, address)
    print "Sending request 1"

    recv_data, addr = client_socket.recvfrom(2048)

    print recv_data, "!!"

Вывод на клиенте просто "Отправка запроса 1", и когда точка останова используется для чего-либо в вызове recvfrom или ниже, он не достигает точки останова. Поэтому я полагаю, что клиент ничего не получает и удерживает С другой стороны, вывод на сервере:

  • Прослушивание
  • Запрос 1
  • Полученный запрос 1
  • Прослушивание
  • Ответ 1

и s o дальше и так далее

После первого цикла сервер повторяет цикл снова и печатает RESPONSE 1.Это означает, что сервер получил запрос 1, отправил ответ 1 клиенту, зациклился... но после того, как он зациклился во второй раз, ответ 1 ВСЕ ЕЩЕ в своем сокете! Вот почему, когда он печатает recv_data, он печатает ответ 1. С другой стороны, клиент не печатает recv_data, потому что клиент их не получил - они все еще находятся в буфере сокета сервера.

Пожалуйста, помогите. Я пробовал искать другие эхо-программы, но все они, кажется, используют TCP и довольно просты (и я думаю, что я в значительной степени следовал тем же самым шагам). Я понятия не имею, почему моя программа UDP не работает. Я попытался просмотреть вызов sendall(), но, похоже, он работает только для TCP.

10
задан misaochan 25 March 2012 в 18:28
поделиться