Я пытаюсь добиться межпроцессного взаимодействия с сокетом.У меня есть этот код, который действует как сервер сокетов.При получении сообщения сервер передает все сообщение другим подключенным клиентам.
from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread
clients = []
HOST = gethostname()
PORT = 33000
BUFFER_SIZE = 1024
ADDR = (HOST, PORT)
s = socket(AF_INET, SOCK_STREAM)
s.bind(ADDR)
def accept_client():
while True:
client, _ = s.accept()
clients.append(client)
print("Client accepted.")
thread.start_new_thread(handle_client, (client, ))
def handle_client(client):
while True:
message = client.recv(BUFFER_SIZE)
print("Incoming message: {}".format(message.decode('utf-8')))
broadcast(message)
def broadcast(message):
print("Broadcasting...")
for c in clients:
print("Broadcasting to {}".format(c))
c.send(message)
if __name__ == '__main__':
s.listen()
print("Listening...")
thread.start_new_thread(accept_client, ())
try:
while True:
pass
except KeyboardInterrupt:
print("Exited.")
exit(0)
А вот класс для моего клиента.
from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread
class SocketClient:
buffer_size = 1024
def __init__(self, host=gethostname(), port=33000):
self.host = host
self.port = port
self.buffer_size = 1024
self.s = socket(AF_INET, SOCK_STREAM)
self.s.connect((self.host, self.port))
def bind_callback(self, callback, args=()):
thread.start_new_thread(self.receive, (callback, args))
def receive(self, callback, args):
while True:
try:
msg = self.s.recv(self.buffer_size).decode('utf-8')
callback(msg, *args)
except OSError as err:
self.close()
raise err
except NameError:
raise err
def send(self, msg):
try:
self.s.send(msg.encode('utf-8'))
except:
self.close()
def close(self):
self.send('{clientClose}')
self.s.close()
В другом скрипте, в котором я создал объект SocketClient
, , существует бесконечное количество входящих сокетов после завершения скрипта (по Ctrl + D в Python),Сценарий сервера (который печатает попытку при получении входящего сокета) неоднократно показывает это:
Incoming message:
Broadcasting...
Broadcasting to <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44126)>
Broadcasting to <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44276)>
Заметьте, что, кажется, нет входящих сообщений.
Я предполагаю, что я 'Не удалось правильно закрыть сокетное соединение (до выхода).Как этого достичь?Заранее спасибо.