Python: ошибка сломанной трубы / сбой программы при работе в сети - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать систему с программным обеспечением сервера / клиента, одну на Raspberry Pi модель 3B (сервер), а другую на моем настольном компьютере (клиент).Он использует распознавание речи для ввода на стороне клиента и, как мне кажется, может стать причиной проблемы.

Когда я подключаюсь к серверу, одним из способов является то, что я заставляю клиента запрашивать команду передпрослушивание ответа от сервера (создание разорванного канала), другое - прослушивание сервера во время запроса команды (на самом деле не прослушивает команду, просто говорит, чтобы запросить команду)

Клиенткод:

import socket
import threading
import sys

import pyttsx3
import speech_recognition as sr

class Client:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = '192.168.1.222'

    def talk(self, message):
        print(message)
        engine.say(message)
        engine.runAndWait()

    def command(self):
        r = sr.Recognizer()

        with sr.Microphone() as source:
            r.pause_threshold = 1
            audio = r.listen(source)

        try:
            command = r.recognize_google(audio, language='en')
        except:
            self.talk('I\'m sorry, I couldn\'t understand!')
            command = ""

        return command

    def run(self):
        while True:
            self.talk('How can I help?')
            com = self.command()
            com = com.lower()
            print(com)

            self.sock.send(bytes(com, 'utf-8'))

            ''' checks data after command has been found (broken pipe caused)
            while True:
                data = self.sock.recv(1024)
                if len(data) > 0:
                    self.talk(data)
                    break
            '''

    def __init__(self):
        self.sock.connect((self.address, 10000))

        iThread = threading.Thread(target=self.run)
        iThread.deamon = True
        iThread.start()

        ''' checks data while getting command (no command recieved)
        while True:
                data = self.sock.recv(1024)
                if len(data) > 0:
                    self.talk(data)
                    break
        '''

engine = pyttsx3.init()
client = Client()

код сервера:

import socket
import threading

class Server:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        connections = []

        def __init__(self):
                self.sock.bind(('0.0.0.0', 10000))
                self.sock.listen(1)

        def handler(self, c, a):
                while True:
                        data = c.recv(1024)
                        for connection in self.connections:
                                connection.send(bytes(data))
                        if not data:
                                self.connections.remove(c)
                                c.close()
                                break
                        print(data)

        def run(self):

                while True:
                        c, a = self.sock.accept()
                        cThread = threading.Thread(target=self.handler, args=(c,a))
                        cThread.deamon = True
                        cThread.start()

                        self.connections.append(c)
                        print(self.connections)

server = Server()
server.run()

Я ожидаю ответа только после получения команды (пока что в любом случае), в настоящий момент для целей тестирования я хочу толькочтобы вернуть с сервера то, что я отправил (это будет изменено позже, чтобы сервер сам решал, какое сообщение вернуть), поэтому, если я скажу «привет» через мой микрофон, сервер сможет вернуть мой ответ так же (но вбайт)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...