Как отправить пакеты UDP на сервер UDP, который я создал в Python (3.7.3)? - PullRequest
0 голосов
/ 18 апреля 2019

Пожалуйста, позвольте мне начать говорить, что я новичок в Python (студент первого курса CS), и это первый язык программирования, который я изучаю.

У меня есть задание, которое состоит из 2 частей;Клиент и сервер

На стороне сервера я пытаюсь:

1) создать сервер, который постоянно ожидает UDP-сообщения и ожидает двух отдельных UDP-сообщений (string1 и string2)

2) Затем он объединяет строки из 2 пакетов в виде string3, отправляет их клиенту в одном UDP-пакете и запускает снова.

например, сервер получает string1 и string2 в виде pinea и pples, создает ананасы в виде string3 и отправляет string3 клиенту

На стороне клиента я должен написать некоторый код, который: 1) запрашиваетклиент для строки при запуске #

2) разбивает эту строку на 2 (n / 2, если n четное и (n + 1) / 2 и (n-1) / 2, если n нечетное))

3) ожидает строку с сервера в отдельном UDP-пакете

4) проверяет, выводит ли строка с сервера = объединение двух разделенных строк

5) результатиз окончательного ответа

например, пользователь вводит строку как ананасы, клиент отправляет строки1 и строку2 как pinea и pples;затем получает string3 от сервера в виде ананасов и проверяет, что string3 == string1 + string2.

Я пытаюсь выяснить, почему после настройки моего сервера я не могу отправлять пакеты на сервер и с сервера.

В настоящее время я использую Python IDLE 3.7.3, я посмотрел довольно много видео и прочитал некоторые другие форумы по переполнению стека, но не смог определить проблему, как упоминалось ранее, я новичок и очень хотел быспасибо за любую помощь

Вот мой код:

для сервера, который у меня есть:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ("127.0.0.1", 5002)
sock.bind (address)

while True:
    data,addr= sock.recvfrom(1024)
    print (data)
    print (addr)

sock.listen(5)

мой код клиента выглядит следующим образом:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s=str(input("Please input a word: "))
string1 = s[:len(s)//2]
string2 = s[:len(s)//2:] 
message1= string1.encode()
message2= string2.encode()
sock.sendto(message1+message1,("127.0.0.1",5002))
received= sock.recv(1024)
received==string1+string2

while True:
    print (message1, message2)
    print (received)

В настоящее время я получаю сообщение об ошибке «Существующее соединение было принудительно закрыто удаленным хостом», когда я пытаюсь запустить свой клиентский код.

Большое спасибо (это также мой первый раз, когда я использую Stack Overflow, поэтому, пожалуйста, дайте мне знать, если я сделал что-то неуместное в своем посте, чтобы я мог исправить)

1 Ответ

0 голосов
/ 18 апреля 2019

ваш код выглядит странно структурированным, while выходит из последовательности / делает бессмысленные вещи и т.д. ...

Я убрал / переписал твой код так, что он мне подходит. Я использую контекстные менеджеры для того, чтобы сокеты были аккуратно очищены. Для сервера что-то вроде:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.bind(("127.0.0.1", 5002))

    while True:
        data, addr = sock.recvfrom(8192)
        print(data, addr)
        sock.sendto(b"hi from server", addr)

и клиент:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.connect(("127.0.0.1", 5002))

    sock.send(b"hi from client")
    print(sock.recvfrom(8192))

UDP явно «без соединения», но вызов connect позволяет выполнять разрешение имен один раз, а не каждый раз, когда вы send. Я также жестко закодировал сообщения, которые отправляются для простоты.

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

Я бы также предложил использовать socket.getaddrinfo, чтобы ваш код легче работал с IPv6, но это отдельная проблема.

...