Как отправить и манипулировать целым числом в UDP-соединении в терминале - PullRequest
0 голосов
/ 01 мая 2018

Так что у меня проблемы с этой частью моей программы. Прямо сейчас с моим текущим кодом я могу подключаться и общаться с другим компьютером через терминал, но я не могу отправить целое число и заставить его быть распознанным как таковой.

Мне нужно иметь возможность отправить число на сервер и заставить сервер манипулировать номером (например, добавить 1), а затем вернуть результат клиенту и распечатать результат на стороне сервера.

Я не могу заставить себя признать это сообщение целым числом вместо строки!

Вот как я подключаюсь в терминале на стороне сервера:

python ./udpEchoServer.py -s 4004

А вот как я подключаюсь в терминале на стороне клиента:

python ./udpEchoServer.py -c [IP ADDRESS OF THE SERVER] 4004

Вот мой код:

#! /usr/bin/env python

# Client and server for udp (datagram) echo.
#
# Usage: udpecho -s [port]            (to start a server)
# or:    udpecho -c host [port] <file (client)

import sys
from socket import *

ECHO_PORT = 50000 + 7
BUFSIZE = 1024

def main():
    if len(sys.argv) < 2:
        usage()
    if sys.argv[1] == '-s':
        server()
    elif sys.argv[1] == '-c':
        client()
    else:
        usage()

def usage():
    sys.stdout = sys.stderr
    print 'Usage: udpecho -s [port]            (server)'
    print 'or:    udpecho -c host [port] <file (client)'
    sys.exit(2)

def server():
    if len(sys.argv) > 2:
        port = eval(sys.argv[2])
    else:
        port = ECHO_PORT
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(('', port))
    print 'udp echo server ready'
    while 1:
        data, addr = s.recvfrom(BUFSIZE)
        print 'server received %r from %r' % (data, addr)
        s.sendto(data, addr)

def client():
    if len(sys.argv) < 3:
        usage()
    host = sys.argv[2]
    if len(sys.argv) > 3:
        port = eval(sys.argv[3])
    else:
        port = ECHO_PORT
    addr = host, port
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(('', 0))
    print 'udp echo client ready, reading stdin'
    while 1:
        line = sys.stdin.readline()
        if not line:
            break
        s.sendto(line, addr)
        data, fromaddr = s.recvfrom(BUFSIZE)
        print 'client received %r from %r' % (data, fromaddr)

main()

1 Ответ

0 голосов
/ 01 мая 2018

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

Распространенным способом сериализации данных является JSON - он обрабатывает мелкие целочисленные значения, числа с плавающей запятой, строки, списки слов с плавающей запятой,…

Но еще более простой способ - просто использовать str и int, если все, что вы хотите отправить, это целые числа:

num = 5
s.sendto(str(num), add)

… и получить номер:

data, addr = s.recvfrom(BUFSIZE)
num = int(data)

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

data, addr = s.recvfrom(BUFSIZE)
num = int(data)
print 'server received %r from %r' % (data, addr)
data = str(num + 1)
s.sendto(data, addr)
...