class MainApp(QCoreApplication):
    def __init__(self, argv):
        super().__init__(argv)
        self.server = QTcpServer(self)
        self.server.setMaxPendingConnections(1)
        self.server.newConnection.connect(self.onNewConnection)
        self.server.listen(QHostAddress.Any, 6666)
        self.client = QTcpSocket(self)
        self.cap = cv2.VideoCapture(0)

    @pyqtSlot()
    def onNewConnection(self):
        self.client = self.server.nextPendingConnection()
        self.client.disconnected.connect(self.onClientDisconnected)
        self.client.readyRead.connect(self.onClientReadyRead)
        print('connected')

    @pyqtSlot()
    def onClientDisconnected(self):
        print('disconnected')

    @pyqtSlot()
    def onClientReadyRead(self):
        while self.client.canReadLine():
            line = self.client.readLine()[:-1]

            if 'get' == line:
                ret, frame = self.cap.read()
                data = cv2.imencode('.jpg', frame)[1]
                self.client.writeData((str(len(data)) + '\n').encode())
                self.client.writeData(data)
Exemplo n.º 2
0
class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('mainwindow.ui', self)

        self.actionQuit.triggered.connect(self.quit)
        self.local_ip_text = self.findChild(QtWidgets.QLineEdit,
                                            'local_ip_text')
        self.hostname = self.get_ip()[0]
        self.local_ip = self.get_ip()[1]
        self.local_ip_text.setText(self.local_ip)
        print('Hostname: ' + self.hostname + ', ip: ' + self.local_ip)
        self.local_port_text = self.findChild(QtWidgets.QLineEdit,
                                              'local_port_text')

        self.server_ip_text = self.findChild(QtWidgets.QLineEdit,
                                             'server_ip_text')
        self.server_port_text = self.findChild(QtWidgets.QLineEdit,
                                               'server_port_text')

        self.send_text = self.findChild(QtWidgets.QTextEdit, 'send_text')

        self.receive_text = self.findChild(QtWidgets.QTextEdit, 'receive_text')

        self.listen_pb = self.findChild(QtWidgets.QPushButton, 'listen_pb')
        self.listen_pb.clicked.connect(self.start_listening)

        self.connect_pb = self.findChild(QtWidgets.QPushButton, 'connect_pb')
        self.connect_pb.clicked.connect(self.connect_to_server)

        self.clr_rec_button = self.findChild(QtWidgets.QPushButton,
                                             'clr_rec_button')
        self.clr_rec_button.clicked.connect(self.clr_rec)

        self.clr_sent_button = self.findChild(QtWidgets.QPushButton,
                                              'clr_sent_button')
        self.clr_sent_button.clicked.connect(self.clr_sent)

        self.send_button = self.findChild(QtWidgets.QPushButton, 'send_button')
        # self.send_button.clicked.connect(self.send_msg)

        self.rec_text = self.findChild(QtWidgets.QTextEdit, 'rec_text')

        self.send_text = self.findChild(QtWidgets.QTextEdit, 'send_text')

        self.client_server_tab = self.findChild(QtWidgets.QTabWidget,
                                                'client_server_tab')
        self.client_server_tab.currentChanged.connect(self.tabChanged)

        self.connected = False
        self.listening = False
        self.tcp_server = None
        self.server_socket = None
        # self.new_client = QtCore.pyqtSignal(QTcpSocket)
        self.show()

    def tabChanged(self, index):
        print("tab changed")
        self.listen_pb.setText("Start Listening")
        if self.connected:
            self.connected = False
            self.connect_pb.setChecked(False)
        self.clr_rec()
        self.clr_sent()

    def accept_error(self, socket_error):
        """
        An error occurred.

        :param socket_error: QAbstractSocket::SocketError
        """
        print('accept error %s', socket_error)

    def new_connection(self):
        print("accept connection")
        while self.tcp_server.hasPendingConnections():
            # returns a new QTcpSocket
            self.server_socket = self.tcp_server.nextPendingConnection()
        print("Connected")
        self.server_socket.readyRead.connect(self.server_read)
        self.server_socket.disconnected.connect(self.client_disconnected)
        ip = self.get_ip()
        connected_text = 'Connected to ' + self.hostname + ' at ' + self.local_ip + '\r\n'
        self.server_socket.write(bytes(connected_text, encoding="ascii"))
        self.send_text.insertPlainText(connected_text)
        self.server_socket.flush()
        self.listen_pb.setText('Connected')

    def client_disconnected(self):
        print("Client disconnected")
        self.server_socket.close()
        self.listening = False
        self.client_server_tab.setTabEnabled(1, True)
        self.tcp_server.close()
        self.listen_pb.setText('Start Listening')
        self.listen_pb.setChecked(False)

    def server_read(self):
        print("Reading from server socket")
        data = self.server_socket.readAll()
        msgstring = bytes(data).decode()
        print(msgstring)
        print(data, type(data))
        self.receive_text.insertPlainText(msgstring + '\n')
        echo_string = 'From ' + self.hostname + ' at ' + self.local_ip + ': ' + msgstring + '\r\n'
        self.server_socket.write(bytes(echo_string, encoding="ascii"))
        self.server_socket.flush()
        self.send_text.insertPlainText(echo_string)

    def start_listening(self):
        if self.listening:
            self.listen_pb.setChecked(True)
            return

        host_ip = str(self.local_ip_text.text())
        print(host_ip)
        port = int(str(self.local_port_text.text()))
        print(host_ip + " is listening on port ", port)

        if not self.tcp_server:
            print("create tcp server")

            self.tcp_server = QTcpServer(self)
            self.tcp_server.setMaxPendingConnections(1)
            self.tcp_server.acceptError.connect(self.accept_error)
            self.tcp_server.newConnection.connect(self.new_connection)
            self.listening = True
            self.listen_pb.setText('Listening')
            self.client_server_tab.setTabEnabled(1, False)
            print("start listening")

        if not self.tcp_server.listen(QHostAddress.Any, port):
            raise RuntimeError('Network error: cannot listen')

    def connect_to_server(self):
        if self.connected or self.listening:
            self.connect_pb.setChecked(True)
            return
        server_ip = str(self.server_ip_text.text())
        port = int(str(self.local_port_text.text()))
        print("Server IP: ", server_ip)
        if server_ip.find('xxx') != -1:
            print("bad IP")
            QMessageBox.about(
                self, 'Bad Server IP', 'Please give a correct Server IP\n'
                'IP is ' + server_ip)
            self.connect_pb.setChecked(False)
            return
        else:
            self.client_socket = QTcpSocket(self)
            print("Connecting to " + server_ip + ":", port)
            self.client_socket.connectToHost(server_ip, port)
            self.client_socket.waitForConnected(1000)
            self.client_socket.readyRead.connect(self.client_read)

        if self.client_socket.state() != QTcpSocket.ConnectedState:
            QMessageBox.about(
                self, 'Connection failed',
                'Please check IP address and port number\nIs the server running?'
            )
            self.connect_pb.setChecked(False)
            return

        print("Connection established")
        self.connect_pb.setText("Connected")
        self.client_server_tab.setTabEnabled(0, False)
        print("Connecting send button")
        self.send_button.clicked.connect(self.send_msg)
        self.connected = True

    def client_read(self):
        print("Reading from client socket")
        data = self.client_socket.readAll()
        msgstring = bytes(data).decode()
        print(msgstring)
        print(data, type(data))
        self.receive_text.insertPlainText(msgstring + '\n')

    def connection_error(self, socketError):
        QMessageBox.about(
            self, 'Connection failed',
            'Please check IP address and port number\nIs the server running?')
        self.connect_pb.setChecked(False)
        return

    def clr_rec(self):
        self.receive_text.clear()

    def clr_sent(self):
        self.send_text.clear()

    def send_msg(self):
        print('send msg')
        if not self.connected:
            QMessageBox.about(self, 'Not yet connected',
                              'Please connect to the TCP Server first')
        message = str(self.send_text.toPlainText())
        if message == "":
            print("Empty message")
        else:
            print("Message: " + message)
            if message.lower() == 'bye':
                self.client_socket.write(bytes(message, encoding="ascii"))
                self.client_socket.close()
                self.connected = False
                self.connect_pb.setText("Connect to Server")
                self.connect_pb.setChecked(False)
                self.client_server_tab.setTabEnabled(0, True)
                self.send_button.clicked.disconnect(self.send_msg)
                return

            self.client_socket.write(bytes(message, encoding="ascii"))
            self.send_text.clear()
            #
            # wait for the answer
            #
            data = self.client_socket.readAll()
            msg_string = bytes(data).decode()
            # data = self.client_socket.recv(1024).decode()
            self.receive_text.insertPlainText(msg_string)
            self.send_text.clear()

    def quit(self):
        app.exit()


#
# gets the hostname and IP address of the local server
#

    def get_ip(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        hostname = socket.gethostname()
        try:
            # doesn't even have to be reachable
            s.connect(('192.255.255.255', 1))
            IP = s.getsockname()[0]
        except Exception:
            IP = '127.0.0.1'
        finally:
            s.close()
        return (hostname, IP)