Задать вопрос
@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()
  • Вопрос задан
  • 182 просмотра
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

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

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