Генерация звуков, которые перекрываются при получении данных из многопоточного чата - PullRequest
0 голосов
/ 25 февраля 2019

Я пытался создать глупую игрушку, которая позволяла бы людям общаться, а затем программа воспринимала текст и генерировала звуки с сервера на основе текста.Я столкнулся с проблемой, когда в моей комнате чата воспроизводились звуки, которые перекрываются друг с другом, когда разные клиенты вводят текст в свой чат-клиент, когда один клиент отправляет данные, которые должны создавать перекрывающиеся звуки, это толькоиграет это последовательно.Я пытался использовать многопоточность для достижения своих целей, но пока что безуспешно.

from socket import AF_INET, socket, SOCK_STREAM
from threading import Thread
from Music_Handler import *
import pyo
import time

def accept_incoming_connections():
    """Sets up handling for incoming clients."""
    while True:
        client, client_address = SERVER.accept()
        print("%s:%s has connected." % client_address)
        client.send(bytes("Welcome to the chat! Now type your name and press enter!", "utf8"))
        addresses[client] = client_address
        Thread(target=handle_client, args=(client,)).start()

def handle_client(client):  # Takes client socket as argument.
    """Handles a single client connection."""

    name = client.recv(BUFSIZ).decode("utf8")
    enter_sound = client_enters_chat()
    enter_sound.out()
    welcome = 'Welcome %s! If you ever want to quit, type {quit} to exit.' % name
    client.send(bytes(welcome, "utf8"))
    msg = "%s has joined the chat!" % name
    broadcast(bytes(msg, "utf8"))
    clients[client] = name
    msg = client.recv(BUFSIZ)

    def client_loop(msg):
        while True:
            if msg == bytes("{quit}", "utf8"):
                client.send(bytes("{quit}", "utf8"))
                exit_sound = client_leaves_chat()
                exit_sound.out()
                client.close()
                del clients[client]
                broadcast(bytes("%s has left the chat." % name, "utf8"))
                time.sleep(1)
                break
            else:
                #Play Sound From Toy7structure
                TOY7_STRUCTURE.structure(msg)
                broadcast(msg, name+": ")
                print("Message: ", msg.decode("utf-8"))

    Thread(target=client_loop(msg)).start()

def broadcast(msg, prefix=""):  # prefix is for name identification.
    """Broadcasts a message to all the clients."""

    for sock in clients:
        sock.send(bytes(prefix, "utf8")+msg)

HOST = '127.0.0.1'
PORT = 33000
BUFSIZ = 1024
ADDR = (HOST, PORT)

SERVER = socket(AF_INET, SOCK_STREAM)
SERVER.bind(ADDR)

if __name__ == "__main__":
    SERVER.listen(5)
    print("Waiting for connection...")
    #Start formal structure here
    TOY7_STRUCTURE = structure_handler(BOUNDARY1, BOUNDARY2, BOUNDARY3, BOUNDARY4, BOUNDARY5)
    ACCEPT_THREAD = Thread(target=accept_incoming_connections)
    ACCEPT_THREAD.start()
    ACCEPT_THREAD.join()
    SERVER.close()
...