Exemple #1
0
    def start_server(self):
        if not self.is_server_started:
            self.is_server_started = True
            port = 12017
            server_backlog = 10
            send_hz = 10
            ip_list = self.model.teams_list.keys()
            self.server = TCPServer(port,
                                    server_backlog,
                                    whitelist=ip_list,
                                    hz=send_hz)
            self.server.new_connection.connect(
                self.model.new_connection_handler)
            self.server.lost_connection.connect(
                self.model.lost_connection_handler)
            self.server.new_response.connect(self.model.new_response_handler)

            self.server.server_ready.connect(self.server_ready_handler)

            self.model.team_state_change_signal.connect(
                self.server.on_race_state_change)

            self.server_thread = QThread()
            self.server.moveToThread(self.server_thread)
            self.server_thread.started.connect(self.server.run_server)
            self.server_thread.start()
 def run(self):
     log.info('Running server on port %d' % self.port)
     rpcprotocol = RPCProtocol()
     self.tcpserver = TCPServer(self.handler,rpcprotocol)
     self.tcpserver.bind(self.port, self.host)
     self.tcpserver.start(0)
     ioloop.IOLoop.instance().start()
Exemple #3
0
    def on_tcp_server_start_stop_button_clicked(self):
        if self.ui.button_TcpServer.text() == 'Start':
            self.ui.button_TcpServer.setEnabled(False)
            self.ui.lineEdit_TcpServerListenPort.setEnabled(False)
            self.tcp_server_thread = QThread()
            self.tcp_server = TCPServer(
                self.ui.label_LocalIP.text(),
                int(self.ui.lineEdit_TcpServerListenPort.text()))

            self.tcp_server_thread.started.connect(self.tcp_server.start)
            self.tcp_server.status.connect(self.on_tcp_server_status_update)
            self.tcp_server.message.connect(self.on_tcp_server_message_ready)

            self.tcp_server.moveToThread(self.tcp_server_thread)

            self.tcp_server_thread.start()

            self.config['TCP_Server_Port'] = self.ui.lineEdit_TcpServerListenPort.text()
            self.save_config()

        elif self.ui.button_TcpServer.text() == 'Stop':
            self.ui.button_TcpServer.setEnabled(False)
            self.tcp_server.close()

        elif self.ui.button_TcpServer.text() == 'Disconnect':
            self.ui.button_TcpServer.setEnabled(False)
            self.tcp_server.disconnect()
Exemple #4
0
    def __init__(self, host="0.0.0.0", port=21000):
        TCPServer.__init__(self)

        self.host = host
        self.port = port

        self.loop = None
        self.www = WebServer(self)
class RPCServer(object):
    def __init__(self,port,host=''):
        self.handler = RPCHandler(self)
        self.port = port
        self.host = host
        self.tcpserver = None
        self.serviceMap = {}

    def registerService(self, service):
        '''Register an RPC service.'''
        self.serviceMap[service.GetDescriptor().full_name] = service

    def run(self):
        log.info('Running server on port %d' % self.port)
        rpcprotocol = RPCProtocol()
        self.tcpserver = TCPServer(self.handler,rpcprotocol)
        self.tcpserver.bind(self.port, self.host)
        self.tcpserver.start(0)
        ioloop.IOLoop.instance().start()

    def stop(self):
        self.tcpserver.stop()
        ioloop.IOLoop.instance().stop()
Exemple #6
0
# mohoque

from tcpserver import TCPServer

if __name__ == "__main__":

    serverAddr = '127.0.0.1'
    port = 8080
    d = TCPServer(serverAddr, port)
    d.start_server()
Exemple #7
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.showMaximized()
        self.setWindowTitle("EVGP Race Control System")

        self.is_server_started = False

        teams_list_file_path = "racers_list.yaml"
        if not os.path.exists(teams_list_file_path):
            logging.warning("No racers_list.yaml found!")
            msgBox = QMessageBox()
            msgBox.setIcon(QMessageBox.Warning)
            msgBox.setText(
                "No racers_list.yaml found.\nPress Open and use the file explorer to select the racer list YAML file"
            )
            msgBox.setWindowTitle("No racers_list.yaml found!")
            msgBox.setStandardButtons(QMessageBox.Open)
            returnValue = msgBox.exec()
            if returnValue == QMessageBox.Open:
                teams_list_file_path = QFileDialog.getOpenFileName(
                    self, 'Open Racer List File', os.getcwd(),
                    "Yaml files (*.yaml)")[0]
        self.model = RCSModel(teams_list_file_path)

        layout = QGridLayout()
        layout.setColumnStretch(0, 10)
        layout.setColumnStretch(1, 10)

        #FILTERED ACTIVE RACE TABLE
        self.activeRaceProxyModel = RCSSortFilterProxyModel(True)
        self.activeRaceProxyModel.setDynamicSortFilter(True)
        self.activeRaceProxyModel.setSourceModel(self.model)

        self.activeRaceTable = QtWidgets.QTableView()
        self.activeRaceTable.setModel(self.activeRaceProxyModel)
        self.activeRaceTable.setSizeAdjustPolicy(
            QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.activeRaceTable.horizontalHeader().setStretchLastSection(True)
        self.activeRaceTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.activeRaceTable.setSelectionBehavior(
            QtWidgets.QTableView.SelectRows)
        self.activeRaceTable.setSelectionMode(
            QtWidgets.QTableView.SingleSelection)
        layout.addWidget(self.activeRaceTable, 1, 0)

        self.standbyRaceProxyModel = RCSSortFilterProxyModel(False)
        self.standbyRaceProxyModel.setDynamicSortFilter(True)
        self.standbyRaceProxyModel.setSourceModel(self.model)

        self.standbyRaceTable = QtWidgets.QTableView()
        self.standbyRaceTable.setModel(self.standbyRaceProxyModel)
        self.standbyRaceTable.setSizeAdjustPolicy(
            QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.standbyRaceTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.standbyRaceTable.horizontalHeader().setStretchLastSection(True)
        self.standbyRaceTable.setSelectionBehavior(
            QtWidgets.QTableView.SelectRows)
        self.standbyRaceTable.setSelectionMode(
            QtWidgets.QTableView.SingleSelection)
        layout.addWidget(self.standbyRaceTable, 1, 1)

        self.activeRaceTableLabel = QLabel("Active Race Table")
        self.activeRaceTableLabel.setAlignment(Qt.AlignCenter)
        self.standbyRaceTableLabel = QLabel("Other Teams Table")
        self.standbyRaceTableLabel.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.activeRaceTableLabel, 0, 0)
        layout.addWidget(self.standbyRaceTableLabel, 0, 1)

        self.standbyRaceTable.setSortingEnabled(True)
        self.standbyRaceTable.sortByColumn(1, Qt.AscendingOrder)
        self.activeRaceTable.setSortingEnabled(True)
        self.activeRaceTable.sortByColumn(1, Qt.AscendingOrder)

        self.selectedIndex = None
        self.standbyRaceTable.selectionModel().selectionChanged.connect(
            self.standby_race_table_selection_handler)
        self.activeRaceTable.selectionModel().selectionChanged.connect(
            self.active_race_table_selection_handler)

        self.horizontalGroupBox = QGroupBox("")
        self.horizontalGroupBox.setLayout(layout)

        # All relevant buttons in sidebar
        self.button_sidebar_vBox = QVBoxLayout()
        layout.addLayout(self.button_sidebar_vBox, 1, 3)
        self.button_sidebar_vBox.setAlignment(Qt.AlignTop)

        # Move Racers Buttons
        self.button_container_stylesheet = "QWidget#ButtonContainer{background-color: rgb(200, 200, 200);\n border-radius: 5;\n}"
        move_racers_button_container = QWidget()
        move_racers_button_container.setObjectName("ButtonContainer")
        move_racers_button_container.setStyleSheet(
            self.button_container_stylesheet)
        move_racers_button_container.setSizePolicy(QSizePolicy.Preferred,
                                                   QSizePolicy.Maximum)
        move_racers_layout = QVBoxLayout(move_racers_button_container)
        move_racers_layout.addWidget(QLabel("ADMIN CONTROLS"))
        move_to_active_race_button = QPushButton("Move to Active Race")
        move_to_active_race_button.clicked.connect(self.move_to_active_race)
        move_racers_layout.addWidget(move_to_active_race_button)
        remove_from_active_race_button = QPushButton("Remove from Active Race")
        remove_from_active_race_button.clicked.connect(
            self.remove_from_active_race)
        move_racers_layout.addWidget(remove_from_active_race_button)

        self.button_sidebar_vBox.addWidget(move_racers_button_container)

        # Team State Control Buttons
        team_state_button_container = QWidget()
        team_state_button_container.setObjectName("ButtonContainer")
        team_state_button_container.setStyleSheet(
            self.button_container_stylesheet)
        team_state_button_container.setSizePolicy(QSizePolicy.Preferred,
                                                  QSizePolicy.Maximum)
        team_state_btns = self.create_team_state_buttons()
        team_state_layout = QVBoxLayout(team_state_button_container)
        team_state_layout.addWidget(QLabel("TEAM CONTROLS"))
        for btn in team_state_btns:
            team_state_layout.addWidget(btn)
        self.button_sidebar_vBox.addWidget(team_state_button_container)

        # Race State Control Buttons
        race_state_button_container = QWidget()
        race_state_button_container.setObjectName("ButtonContainer")
        race_state_button_container.setStyleSheet(
            self.button_container_stylesheet)
        race_state_button_container.setSizePolicy(QSizePolicy.Preferred,
                                                  QSizePolicy.Maximum)
        race_state_btns = self.create_race_state_buttons()
        race_state_layout = QVBoxLayout(race_state_button_container)
        race_state_layout.addWidget(QLabel("RACE CONTROLS"))
        for btn in race_state_btns:
            race_state_layout.addWidget(btn)
        self.button_sidebar_vBox.addWidget(race_state_button_container)

        self.info_group_box = QGroupBox("Race Status Information")
        self.race_state_label = QLabel("Race State: IN_GARAGE")
        self.info_label = QLabel("Race Status: No Race running.")
        info_layout = QVBoxLayout()
        info_layout.addWidget(self.race_state_label)
        info_layout.addWidget(self.info_label)
        self.info_group_box.setLayout(info_layout)
        layout.addWidget(self.info_group_box, 3, 0)

        self.buttonController = ButtonStateController(
            race_state_btns[0], race_state_btns[1], race_state_btns[2],
            race_state_btns[3], race_state_btns[4], team_state_btns[0],
            move_to_active_race_button, remove_from_active_race_button,
            self.race_state_label, self.info_label)
        self.model.race_state_change_signal.connect(
            self.buttonController.race_state_updated)

        verticalSpacer = QtWidgets.QSpacerItem(20, 40, QSizePolicy.Minimum,
                                               QSizePolicy.Expanding)
        layout.addItem(verticalSpacer, 4, 0, rowSpan=1, columnSpan=3)

        self.create_menu_bar()

        # wait for start of server
        self.server_wait_label = QLabel(
            "Waiting for TCP Server to start. Please hold on.")
        self.server_wait_label.setAlignment(Qt.AlignCenter)
        self.setCentralWidget(self.server_wait_label)
        self.start_server()

    # Make sure we stop the server on window close
    def closeEvent(self, event):
        self.stop_server()
        event.accept()

    def create_menu_bar(self):
        menuBar = QtWidgets.QMenuBar(self)
        self.setMenuBar(menuBar)
        helpMenu = menuBar.addMenu("&Help")
        self.reset_gui_buttons_actions = QtWidgets.QAction("Reset GUI buttons")
        self.reset_gui_buttons_actions.triggered.connect(
            self.buttonController.enable_all_buttons)
        helpMenu.addAction(self.reset_gui_buttons_actions)
        self.about_action = QtWidgets.QAction("About")
        self.about_action.triggered.connect(self.show_about_message)
        helpMenu.addAction(self.about_action)

    def show_about_message(self):
        text = "The Electric Vehicle GrandPrix Autonomous Race Control System " \
        "is brought to you by the RoboJackets at Georgia Tech.<br>" \
        "Contribute to the RCS at <a href='https://github.com/RoboJackets/evgp-rcs'>https://github.com/RoboJackets/evgp-rcs</a>"

        QMessageBox.question(self, 'About the EVGP Race Control System', text,
                             QMessageBox.Ok)

    def create_race_state_buttons(self):
        grid_active_race_button = QPushButton("GRID ACTIVE RACE")
        grid_active_race_button.clicked.connect(
            lambda: self.race_state_change_callback(RaceState.GRID_ACTIVE))
        start_race_button = QPushButton("START RACE")
        start_race_button.setEnabled(False)
        start_race_button.clicked.connect(
            lambda: self.race_state_change_callback(RaceState.GREEN_GREEN))
        red_flag_race_button = QPushButton("RED FLAG RACE")
        red_flag_race_button.clicked.connect(
            lambda: self.race_state_change_callback(RaceState.RED_FLAG))
        e_stop_race_button = QPushButton("E-STOP RACE")
        e_stop_race_button.clicked.connect(
            lambda: self.race_state_change_callback(RaceState.RED_RED))
        finish_race_button = QPushButton("FINISH RACE")
        finish_race_button.clicked.connect(
            lambda: self.race_state_change_callback(RaceState.IN_GARAGE))

        return [
            grid_active_race_button, start_race_button, red_flag_race_button,
            e_stop_race_button, finish_race_button
        ]

    def create_team_state_buttons(self):
        in_garage_team_button = QPushButton("IN GARAGE TEAM")
        in_garage_team_button.clicked.connect(
            lambda: self.team_state_change_callback(RaceState.IN_GARAGE))
        red_flag_team_button = QPushButton("RED FLAG TEAM")
        red_flag_team_button.clicked.connect(
            lambda: self.team_state_change_callback(RaceState.RED_FLAG))
        e_stop_team_button = QPushButton("E-STOP TEAM")
        e_stop_team_button.clicked.connect(
            lambda: self.team_state_change_callback(RaceState.RED_RED))

        return [
            in_garage_team_button, red_flag_team_button, e_stop_team_button
        ]

    def team_state_change_callback(self, state):
        if self.selectedIndex is not None:
            self.model.team_state_change(self.selectedIndex, state)

    def race_state_change_callback(self, state):
        self.model.race_state_change(state)

    def move_to_active_race(self):
        if self.selectedIndex is not None:
            changed = self.model.move_to_active_race(self.selectedIndex)
            if changed:
                self.clearAllSelections()

    def remove_from_active_race(self):
        if self.selectedIndex is not None:
            changed = self.model.move_to_standby_race(self.selectedIndex)
            if changed:
                self.clearAllSelections()

    def start_server(self):
        if not self.is_server_started:
            self.is_server_started = True
            port = 12017
            server_backlog = 10
            send_hz = 10
            ip_list = self.model.teams_list.keys()
            self.server = TCPServer(port,
                                    server_backlog,
                                    whitelist=ip_list,
                                    hz=send_hz)
            self.server.new_connection.connect(
                self.model.new_connection_handler)
            self.server.lost_connection.connect(
                self.model.lost_connection_handler)
            self.server.new_response.connect(self.model.new_response_handler)

            self.server.server_ready.connect(self.server_ready_handler)

            self.model.team_state_change_signal.connect(
                self.server.on_race_state_change)

            self.server_thread = QThread()
            self.server.moveToThread(self.server_thread)
            self.server_thread.started.connect(self.server.run_server)
            self.server_thread.start()

    def stop_server(self):
        if self.is_server_started:
            self.server.stop()
            self.is_server_started = False
            self.server_thread.quit()

    @QtCore.pyqtSlot(bool)
    def server_ready_handler(self, isReady):
        if isReady:
            self.setCentralWidget(self.horizontalGroupBox)
        if not isReady:
            self.server_wait_label.setText(
                "Server Error: Please restart program.")
            QMessageBox.question(
                self, 'Server Error',
                "Server failed to start.\nPress \"Close\" to quit program, then fix your network issues and restart this program.",
                QMessageBox.Close)
            self.close()

    @QtCore.pyqtSlot(QItemSelection, QItemSelection)
    def standby_race_table_selection_handler(self, filterTableSelection,
                                             filterTableDeselected):
        if filterTableSelection.indexes():
            self.activeRaceTable.selectionModel().clearSelection()
            self.selectedIndex = self.standbyRaceProxyModel.mapToSource(
                filterTableSelection.indexes()[0]).row()

    @QtCore.pyqtSlot(QItemSelection, QItemSelection)
    def active_race_table_selection_handler(self, tableSelection,
                                            tableDeselected):
        if tableSelection.indexes():
            self.standbyRaceTable.selectionModel().clearSelection()
            self.selectedIndex = self.activeRaceProxyModel.mapToSource(
                tableSelection.indexes()[0]).row()

    def clearAllSelections(self):
        self.activeRaceTable.selectionModel().clearSelection()
        self.standbyRaceTable.selectionModel().clearSelection()
        self.selectedIndex = None
# An example showing the use of httpserver.TCPServer
# Reverses the data received from the client and send it back

import sys

# Import httpserver in the python import path
sys.path.insert(0, "./httpserver")

from tcpserver import TCPServer


def reverse_data(queue, data):
    queue.put(data[::-1])
    print(data)


if __name__ == '__main__':
    server = TCPServer('127.0.0.1', 8000, callback=reverse_data)
    server.start()
    server.run()

Exemple #9
0
class MyApp(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        super(QtWidgets.QMainWindow, self).__init__()

        self.status_message = ['● Idle', '● Idle', '● Idle', '']

        config_file = Path('config.json')
        # config_file = open('config.json', 'w+')
        if config_file.exists():
            self.config = json.load(open('config.json', 'r'))
        else:
            self.config = dict()
            json.dump(self.config, open('config.json', 'w+'))

        """Load UI"""
        self.ui = uic.loadUi('mainwindow.ui', self)
        self.init_ui()

        self.ui.comboBox_Interface.currentIndexChanged.connect(
            self.on_interface_selection_change)
        self.ui.button_Refresh.clicked.connect(self.on_refresh_button_clicked)

        self.ui.button_TcpClient.clicked.connect(
            self.on_tcp_client_connect_button_clicked
        )
        self.ui.button_TcpClientSend.clicked.connect(
            self.on_tcp_client_message_send
        )
        self.ui.lineEdit_TcpClientSend.returnPressed.connect(
            self.on_tcp_client_message_send
        )

        self.ui.button_TcpServer.clicked.connect(
            self.on_tcp_server_start_stop_button_clicked)
        self.ui.button_TcpServerSend.clicked.connect(
            self.on_tcp_server_message_send
        )
        self.ui.lineEdit_TcpServerSend.returnPressed.connect(
            self.on_tcp_server_message_send
        )

        self.ui.button_Udp.clicked.connect(
            self.on_udp_server_start_stop_button_clicked
        )
        self.ui.button_UdpSend.clicked.connect(
            self.on_udp_message_send
        )
        self.ui.lineEdit_UdpSend.returnPressed.connect(
            self.on_udp_message_send
        )
        self.udp_send = UDPServer(
            '0.0.0.0',
            1234)

        self.ui.tabWidget.currentChanged.connect(
            self.on_tab_changed
        )

    def save_config(self):
        try:
            json.dump(self.config, open('config.json', 'w+'))
        except PermissionError as err:
            pass

    def init_ui(self):
        # Interface
        self.update_network_interfaces()

        self.ui.tabWidget.setCurrentIndex(self.config.get('Tab_Index', 0))
        self.on_tab_changed(self.config.get('Tab_Index', 0))

        # TCP Client
        self.ui.textBrowser_TcpClientMessage.setEnabled(False)
        self.ui.lineEdit_TcpClientSend.setEnabled(False)
        self.ui.button_TcpClientSend.setEnabled(False)

        tcp_client_ip = self.config.get('TCP_Client_IP', '127.0.0.1')
        tcp_client_port = self.config.get('TCP_Client_Port', '1234')
        self.ui.lineEdit_TcpClientTargetIP.setText(tcp_client_ip)
        self.ui.lineEdit_TcpClientTargetPort.setText(tcp_client_port)

        # TCP Server
        self.ui.textBrowser_TcpServerMessage.setEnabled(False)
        self.ui.lineEdit_TcpServerSend.setEnabled(False)
        self.ui.button_TcpServerSend.setEnabled(False)

        tcp_server_port = self.config.get('TCP_Server_Port', '1234')
        self.ui.lineEdit_TcpServerListenPort.setText(tcp_server_port)

        # UDP
        udp_listen_port = self.config.get('UDP_Listen_Port', '1234')
        udp_target_ip = self.config.get('UDP_Target_IP', '127.0.0.1')
        udp_target_port = self.config.get('UDP_Target_Port', '1234')
        self.ui.lineEdit_UdpListenPort.setText(udp_listen_port)
        self.ui.lineEdit_UdpTargetIP.setText(udp_target_ip)
        self.ui.lineEdit_UdpTargetPort.setText(udp_target_port)

    def update_network_interfaces(self):
        self.ui.comboBox_Interface.clear()
        self.net_if = psutil.net_if_addrs()
        net_if_stats = psutil.net_if_stats()

        net_names = list(self.net_if.keys())

        for if_name in net_names:
            if not net_if_stats[if_name].isup:
                self.net_if.pop(if_name, None)
            else:
                self.ui.comboBox_Interface.addItem(if_name)

        interface_idx = self.config.get('Interface', 0)

        if interface_idx >= self.ui.comboBox_Interface.count():
            self.ui.comboBox_Interface.setCurrentIndex(0)
        else:
            self.ui.comboBox_Interface.setCurrentIndex(interface_idx)

        current_interface = self.ui.comboBox_Interface.currentText()
        self.config['Interface'] = self.ui.comboBox_Interface.currentIndex()

        for snicaddr in self.net_if[current_interface]:
            if snicaddr.family == socket.AF_INET:
                ipv4_add = snicaddr.address
                break
            else:
                ipv4_add = '0.0.0.0'

        self.ui.label_LocalIP.setText(ipv4_add)

        self.save_config()

    def on_interface_selection_change(self):
        current_interface = self.ui.comboBox_Interface.currentText()

        if current_interface in self.net_if:
            for snicaddr in self.net_if[current_interface]:
                if snicaddr.family == socket.AF_INET:
                    ipv4_add = snicaddr.address
                    break
                else:
                    ipv4_add = '0.0.0.0'
        else:
            return

        self.ui.label_LocalIP.setText(ipv4_add)
        self.config['Interface'] = self.ui.comboBox_Interface.currentIndex()
        self.save_config()

    def on_refresh_button_clicked(self):
        self.update_network_interfaces()

    # TCP Client
    def on_tcp_client_connect_button_clicked(self):
        if self.ui.button_TcpClient.text() == 'Connect':
            self.ui.button_TcpClient.setEnabled(False)
            self.ui.lineEdit_TcpClientTargetIP.setEnabled(False)
            self.ui.lineEdit_TcpClientTargetPort.setEnabled(False)

            self.tcp_client_thread = QThread()
            self.tcp_client = TCPClient(
                self.ui.label_LocalIP.text(),
                int(self.ui.lineEdit_TcpClientTargetPort.text()))

            self.tcp_client_thread.started.connect(self.tcp_client.start)
            self.tcp_client.status.connect(self.on_tcp_client_status_update)
            self.tcp_client.message.connect(self.on_tcp_client_message_ready)

            self.tcp_client.moveToThread(self.tcp_client_thread)

            self.tcp_client_thread.start()

            self.config['TCP_Client_IP'] = self.ui.label_LocalIP.text()
            self.config['TCP_Client_Port'] = self.ui.lineEdit_TcpClientTargetPort.text()
            self.save_config()

        elif self.ui.button_TcpClient.text() == 'Disconnect':
            self.ui.button_TcpClient.setEnabled(False)
            self.tcp_client.close()

    def on_tcp_client_status_update(self, status, addr):
        if status == TCPClient.STOP:
            self.tcp_client.status.disconnect()
            self.tcp_client.message.disconnect()

            self.ui.button_TcpClient.setText('Connect')
            self.tcp_client_thread.quit()

            self.ui.lineEdit_TcpClientTargetIP.setEnabled(True)
            self.ui.lineEdit_TcpClientTargetPort.setEnabled(True)

            self.ui.textBrowser_TcpClientMessage.setEnabled(False)
            self.ui.lineEdit_TcpClientSend.setEnabled(False)
            self.ui.button_TcpClientSend.setEnabled(False)
            self.status_message[0] = '● Idle'
            if self.ui.tabWidget.currentIndex() == 0:
                self.on_tab_changed(0)

        elif status == TCPClient.CONNECTED:
            self.ui.button_TcpClient.setText('Disconnect')

            self.ui.textBrowser_TcpClientMessage.setEnabled(True)
            self.ui.lineEdit_TcpClientSend.setEnabled(True)
            self.ui.button_TcpClientSend.setEnabled(True)
            self.status_message[0] = '● Connected to ' +\
                self.ui.label_LocalIP.text() +\
                ':'+self.ui.lineEdit_TcpClientTargetPort.text()
            if self.ui.tabWidget.currentIndex() == 0:
                self.on_tab_changed(0)

        self.ui.button_TcpClient.setEnabled(True)

    def on_tcp_client_message_ready(self, source, msg):
        self.ui.textBrowser_TcpClientMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;"><strong>----- ' +
            source +
            ' -----</strong></span></p>')
        self.ui.textBrowser_TcpClientMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;">' +
            msg +
            '</span></p>')

    def on_tcp_client_message_send(self):
        self.tcp_client.send(self.ui.lineEdit_TcpClientSend.text())
        self.ui.textBrowser_TcpClientMessage.append(
            '<p style="text-align: center;"><strong>----- ' +
            'this' +
            ' -----</strong></p>')
        self.ui.textBrowser_TcpClientMessage.append(
            '<p style="text-align: center;">' +
            self.ui.lineEdit_TcpClientSend.text() +
            '</p>')
        self.ui.lineEdit_TcpClientSend.clear()

    # TCP Server
    def on_tcp_server_start_stop_button_clicked(self):
        if self.ui.button_TcpServer.text() == 'Start':
            self.ui.button_TcpServer.setEnabled(False)
            self.ui.lineEdit_TcpServerListenPort.setEnabled(False)
            self.tcp_server_thread = QThread()
            self.tcp_server = TCPServer(
                self.ui.label_LocalIP.text(),
                int(self.ui.lineEdit_TcpServerListenPort.text()))

            self.tcp_server_thread.started.connect(self.tcp_server.start)
            self.tcp_server.status.connect(self.on_tcp_server_status_update)
            self.tcp_server.message.connect(self.on_tcp_server_message_ready)

            self.tcp_server.moveToThread(self.tcp_server_thread)

            self.tcp_server_thread.start()

            self.config['TCP_Server_Port'] = self.ui.lineEdit_TcpServerListenPort.text()
            self.save_config()

        elif self.ui.button_TcpServer.text() == 'Stop':
            self.ui.button_TcpServer.setEnabled(False)
            self.tcp_server.close()

        elif self.ui.button_TcpServer.text() == 'Disconnect':
            self.ui.button_TcpServer.setEnabled(False)
            self.tcp_server.disconnect()

    def on_tcp_server_status_update(self, status, addr):
        if status == TCPServer.STOP:
            self.tcp_server.status.disconnect()
            self.tcp_server.message.disconnect()

            self.ui.button_TcpServer.setText('Start')
            self.tcp_server_thread.quit()

            self.ui.textBrowser_TcpServerMessage.setEnabled(False)
            self.ui.lineEdit_TcpServerSend.setEnabled(False)
            self.ui.button_TcpServerSend.setEnabled(False)
            self.ui.lineEdit_TcpServerListenPort.setEnabled(True)
            self.status_message[1] = '● Idle'
            if self.ui.tabWidget.currentIndex() == 1:
                self.on_tab_changed(1)

        elif status == TCPServer.LISTEN:
            self.ui.button_TcpServer.setText('Stop')

            self.ui.textBrowser_TcpServerMessage.setEnabled(False)
            self.ui.lineEdit_TcpServerSend.setEnabled(False)
            self.ui.button_TcpServerSend.setEnabled(False)
            self.status_message[1] = '● Listen on ' +\
                self.ui.label_LocalIP.text()+':' +\
                self.ui.lineEdit_TcpServerListenPort.text()
            if self.ui.tabWidget.currentIndex() == 1:
                self.on_tab_changed(1)

        elif status == TCPServer.CONNECTED:
            self.ui.button_TcpServer.setText('Disconnect')

            self.ui.textBrowser_TcpServerMessage.setEnabled(True)
            self.ui.lineEdit_TcpServerSend.setEnabled(True)
            self.ui.button_TcpServerSend.setEnabled(True)
            self.status_message[1] = '● Connected to '+addr
            if self.ui.tabWidget.currentIndex() == 1:
                self.on_tab_changed(1)
            # self.tcp_server.send('Hello World')

        self.ui.button_TcpServer.setEnabled(True)

    def on_tcp_server_message_ready(self, source, msg):
        self.ui.textBrowser_TcpServerMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;"><strong>----- ' +
            source +
            ' -----</strong></span></p>')
        self.ui.textBrowser_TcpServerMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;">' +
            msg +
            '</span></p>')

    def on_tcp_server_message_send(self):
        self.tcp_server.send(self.ui.lineEdit_TcpServerSend.text())
        self.ui.textBrowser_TcpServerMessage.append(
            '<p style="text-align: center;"><strong>----- ' +
            'this' +
            ' -----</strong></p>')
        self.ui.textBrowser_TcpServerMessage.append(
            '<p style="text-align: center;">' +
            self.ui.lineEdit_TcpServerSend.text() +
            '</p>')
        self.ui.lineEdit_TcpServerSend.clear()

    # UDP
    def on_udp_server_start_stop_button_clicked(self):
        if self.ui.button_Udp.text() == 'Start':
            self.ui.button_Udp.setEnabled(False)
            self.ui.lineEdit_UdpListenPort.setEnabled(False)
            self.udp_thread = QThread()
            self.udp_server = UDPServer(
                self.ui.label_LocalIP.text(),
                int(self.ui.lineEdit_UdpListenPort.text()))

            self.udp_thread.started.connect(self.udp_server.start)
            self.udp_server.status.connect(self.on_udp_server_status_update)
            self.udp_server.message.connect(self.on_udp_server_message_ready)

            self.udp_server.moveToThread(self.udp_thread)

            self.udp_thread.start()

            self.config['UDP_Listen_Port'] = self.ui.lineEdit_UdpListenPort.text()
            self.save_config()

        elif self.ui.button_Udp.text() == 'Stop':
            self.ui.button_Udp.setEnabled(False)
            self.udp_server.close()

    def on_udp_server_status_update(self, status, addr):
        if status == UDPServer.STOP:
            self.udp_server.status.disconnect()
            self.udp_server.message.disconnect()

            self.ui.button_Udp.setText('Start')
            # self.tcp_server_thread.terminate()
            self.udp_thread.quit()

            self.ui.lineEdit_UdpListenPort.setEnabled(True)
            self.status_message[2] = '● Idle'
            if self.ui.tabWidget.currentIndex() == 2:
                self.on_tab_changed(2)

        elif status == UDPServer.LISTEN:
            self.ui.button_Udp.setText('Stop')
            self.status_message[2] = '● Listen on ' +\
                self.ui.label_LocalIP.text()+':' +\
                self.ui.lineEdit_TcpServerListenPort.text()
            if self.ui.tabWidget.currentIndex() == 2:
                self.on_tab_changed(2)

        self.ui.button_Udp.setEnabled(True)

    def on_udp_server_message_ready(self, source, msg):
        self.ui.textBrowser_UdpMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;"><strong>----- ' +
            source +
            ' -----</strong></span></p>')
        self.ui.textBrowser_UdpMessage.append(
            '<p style="text-align: center;"><span style="color: #2196F3;">' +
            msg +
            '</span></p>')

    def on_udp_message_send(self):
        self.udp_send.send(
            self.ui.lineEdit_UdpSend.text(),
            self.ui.lineEdit_UdpTargetIP.text(),
            int(self.ui.lineEdit_UdpTargetPort.text())
        )
        self.ui.textBrowser_UdpMessage.append(
            '<p style="text-align: center;"><strong>----- ' +
            'this' +
            ' -----</strong></p>')
        self.ui.textBrowser_UdpMessage.append(
            '<p style="text-align: center;">' +
            self.ui.lineEdit_UdpSend.text() +
            '</p>')
        self.ui.lineEdit_UdpSend.clear()

        self.config['UDP_Target_IP'] = self.ui.lineEdit_UdpTargetIP.text()
        self.config['UDP_Target_Port'] = self.ui.lineEdit_UdpTargetPort.text()
        self.save_config()

    def on_tab_changed(self, index):
        self.ui.statusBar.clearMessage()
        self.ui.statusBar.setStyleSheet('color: green')
        self.ui.statusBar.showMessage(self.status_message[index])

        self.config['Tab_Index'] = self.ui.tabWidget.currentIndex()
        self.save_config()