Клиентская / серверная программа Python UDP, проблемы - PullRequest
10 голосов
/ 25 марта 2012

Я пытаюсь написать базовую клиент-серверную эхо-программу, чтобы проверить использование таймеров для повторной передачи на основе 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
  • Listening
  • Ответ 1

и так далее и тому подобное

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

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

Ответы [ 3 ]

14 голосов
/ 25 марта 2012

Вы должны отправить адрес вместо адреса.

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", addr)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, addr)
2 голосов
/ 25 марта 2012

Здесь происходит то, что сервер отправляет 'Response 1' на localhost:6005, а затем сразу же получает его, поскольку он также прослушивает localhost:6005.

Сервер подключается к своему (address, port) и прослушивает его, как правильно. Когда клиент подключается без привязки первым, ему автоматически присваивается неиспользованный (address, port). Вам нужно будет определить, что (address, port) использует клиент, чтобы ответить на него - либо с помощью bind, чтобы явно установить известный (address, port), либо с помощью addr, возвращенного recvfrom.

1 голос
/ 25 марта 2012

возможно строка 10 на стороне сервера

recv_data, addr = server_socket.recvfrom (2048)

должно быть

recv_data,addr = server_socket.sendto (2048)

?

ps> Я новичок.= Р

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...