Ошибка сокета клиент-сервер Python [Errno 9] Неверный дескриптор файла - PullRequest
0 голосов
/ 19 октября 2018

Я написал простую клиент-серверную эхо-программу, которая выполняет следующие действия:

  1. Клиент отправляет значения x, y, z, градус, отметка времени.
  2. Сервер получает эти значения (в виде строк) и разбирает их на числа с плавающей точкой.
  3. Сервер отправляет обратно ((x / 2), (y / 2), (z / 2) (Степень / 2))
  4. Клиент получаетданных и распечатывает их обратно.

Программа работает как надо, но как только клиент возвращает значения, я получаю следующую ошибку:

Файл "/ System /Библиотека / Каркасы / Python.framework / Versions / 2.7 / lib / python2.7 / socket.py ", строка 174, в _dummy ошибка повышения (EBADF, 'Bad file descriptor')) socket.error: [Errno 9] Bad descriptor file file

Я новичок в python, поэтому я не уверен, что может быть причиной этого.Я читал, что это может относиться к тому, как я закрываю соединение и сокет, но я думал, что сделал это правильно.Любая помощь, чтобы найти и исправить ошибку (и помочь мне узнать больше о Python) приветствуется!Вот мой сервер, который дает мне ошибку:

    import socket


    HOST = '127.0.0.1'
    PORT = 56789

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    print('Connection address: ', addr)
    Message = ''
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        print('Received data: ', data)
        List = data.split(',')
        x = float(List[0]) / 2.0
        y = float(List[1]) / 2.0
        z = float(List[2]) / 2.0
        degree = float(List[3]) / 2.0
        Message = str(x) + ', '
        Message += str(y) + ', '
        Message += str(z) + ', '
        Message += str(degree)
        conn.send(Message)
        conn.close()
        s.close()

1 Ответ

0 голосов
/ 19 октября 2018

вы закрываете соединение с сокетом в цикле while.

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

data = conn.recv (1024)

, но ваше соединение уже закрытотак что вы получите эту ошибку.выведите

conn.close()
s.close()

из цикла while.

...