#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:
Ваша проблема проста.
- Ваш клиент подключается к серверу
- Сервер создает новый поток с бесконечным циклом
- Сервер отправляет простое сообщение
- Клиент получает сообщение
- Клиент закрывает соединение по умолчанию (!!!), поскольку вы вернулись из его метода (больше никаких ссылок)
- Сервер пытается получить сообщение, затем продолжает (здесь ошибка)
Поскольку соединение было закрыто клиентом, сервер не может ни отправить, ни получить следующее сообщение внутри цикла, поскольку оно бесконечно. Это и есть причина ошибки! Также нет обработки ошибок в случае закрытия соединения или протокола для закрытия с каждой стороны.
Если вам нужна функция, которая проверяет, подключен ли сервер к сети или нет, вам следует создать функцию (но я уверен, что достаточно простого подключения), которая работает как 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. Спасибо!!! Единственный ответ, который помог мне решить проблему