ошибка conn.send(‘Hi’.encode()) Ошибка BrokenPipeError: [ошибка 32] Сломанный канал (СОКЕТ)

#python #sockets

#python #сокеты

Вопрос:

привет, я создаю клиентскую модель сервера, которая работает нормально, и я также создаю отдельный графический интерфейс, который должен вводить два ввода server IP and port , только проверяя server , работает он или нет. Но когда я запускаю сервер, а затем запускаю свой графический интерфейс и ввожу IP-адрес сервера и переношу его, он отображается connected в графическом интерфейсе, но на стороне сервера выдает эту ошибку. Сервер-клиент работает нормально, но интеграция графического интерфейса с сервером выдает ошибку ниже на стороне сервера.

conn.send('Hi'.encode()) # send only takes string BrokenPipeError: [Errno 32] Broken pip

Это серверный код:

 from socket import *
# Importing all from thread
import threading

# Defining server address and port
host = 'localhost'
port = 52000
data = " "
# Creating socket object
sock = socket()
# Binding socket to a address. bind() takes tuple of host and port.
sock.bind((host, port))
# Listening at the address
sock.listen(5)  # 5 denotes the number of clients can queue

def clientthread(conn):
    # infinite loop so that function do not terminate and thread do not end.
    while True:
        # Sending message to connected client
        conn.send('Hi'.encode('utf-8'))  # send only takes string
        data =conn.recv(1024)
        print (data.decode())


while True:
    # Accepting incoming connections
    conn, addr = sock.accept()
    # Creating new thread. Calling clientthread function for this function and passing conn as argument.
    thread = threading.Thread(target=clientthread, args=(conn,))
    thread.start()

conn.close()
sock.close()
  

Это часть кода Gui, которая вызывает проблему:

 def isOpen(self, ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip, int(port)))
        data=s.recv(1024)
        if data== b'Hi':
         print("connected")
         return True
    except:
        print("not connected")
        return False

def check_password(self):
    self.isOpen('localhost', 52000)
  

Ответ №1:

Ваша проблема проста.

  1. Ваш клиент подключается к серверу
  2. Сервер создает новый поток с бесконечным циклом
  3. Сервер отправляет простое сообщение
  4. Клиент получает сообщение
  5. Клиент закрывает соединение по умолчанию (!!!), поскольку вы вернулись из его метода (больше никаких ссылок)
  6. Сервер пытается получить сообщение, затем продолжает (здесь ошибка)

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


Если вам нужна функция, которая проверяет, подключен ли сервер к сети или нет, вам следует создать функцию (но я уверен, что достаточно простого подключения), которая работает как ping. Пример:


Клиентская функция:

 def isOpen(self, ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((str(ip), int(port)))
        s.send("ping".encode('utf-8'))
        return s.recv(1024).decode('utf-8') == "pong" # return whether the response match or not
    except:
        return False # cant connect
  

Функция сервера:

 def clientthread(conn):
    while True:
        msg = conn.recv(1024).decode('utf-8') #receiving a message
        if msg == "ping":
            conn.send("pong".encode('utf-8')) # sending the response
            conn.close() # closing the connection on both sides
            break # since we only need to check whether the server is online, we break
  

Из ваших предыдущих вопросов я могу сказать, что у вас есть некоторые проблемы с пониманием того, как работает связь с сокетом TCP. Пожалуйста, найдите минутку и прочитайте несколько статей о том, как обмениваться данными через сокеты. Если вам не нужны живые коммуникации (непрерывный поток данных, например, видео, игровой сервер и т. Д.), Например, Только формы входа, пожалуйста, придерживайтесь хорошо известных протоколов, таких как HTTP. Создание собственного надежного протокола может быть немного сложнее, если вы только что начали программировать сокеты.

Вы могли бы использовать flask для серверной части HTTP.

Комментарии:

1. Спасибо!!! Единственный ответ, который помог мне решить проблему