Задать вопрос
@IgFil

Как не разрывать TCP подключение в Python?

У меня есть код который должен отправлять сообщения от клиента серверу и от сервера клиенту. Но при отправлении второго сообщения и сервер и клиент не отвечают.
Как сделать так чтобы сервер и клиент работали одновременно?
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
import socket
from threading import Thread
import time


def server(message):
    TCPServerSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPServerSocket.bind(('', 9090))
    TCPServerSocket.listen(1)
    while True:
        conn, addr = TCPServerSocket.accept()
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.send(message.encode('utf-8'))
        TCPServerSocket.close()


def client(message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost', 9090))
    sock.send(message.encode('utf-8'))
    while True:
        data = sock.recv(1024)
        print(bytes(data).decode("utf-8"))


def messageShow(message, host):
    if message != "":

        if host == "Хост":
            server(message)

        if host == "клиент":
            client(message)


class ChatApp(App):
    message = "Connect"
    host = input("Хост или клиент")
    if host == "Хост":
        thread1 = Thread(target=server, args=message)
        thread2 = Thread(target=client, args=message)

    def build(self):
        txt_input = TextInput()
        an1 = AnchorLayout(anchor_x='left', anchor_y="bottom")
        container_body = BoxLayout()
        container_body.add_widget(TextInput(readonly=True))
        container_input = BoxLayout(orientation='horizontal', size_hint=[1, .1])
        container_input.add_widget(txt_input)
        btn_input = Button(text="Отправить", size_hint=[.5, 1])
        btn_input.bind(on_press=lambda *a: messageShow(txt_input.text, host))
        container_input.add_widget(btn_input)
        an1.add_widget(container_body)
        an1.add_widget(container_input)
        return an1


if __name__ == "__main__":
    host = input("Хост или клиент")

    ChatApp().run()
  • Вопрос задан
  • 185 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Python-разработчик
    10 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы