File: quiz_server_backup.py

package info (click to toggle)
kuttypy 2.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,896 kB
  • sloc: python: 58,651; javascript: 14,686; xml: 5,767; ansic: 2,716; makefile: 453; asm: 254; sh: 48
file content (124 lines) | stat: -rw-r--r-- 4,431 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication

# blueprint for socket comms parts of app
flask_thread = None
showStatusSignal = None
import socket, threading


def setStatusSignal(sig):
    global showStatusSignal
    showStatusSignal = sig


def create_server(showStatusSignal, serverSignal, removeSignal, imageSignal, local_ip):
    setStatusSignal(showStatusSignal)
    mythread = QuizResponseThread()
    mythread.setServerSignal(serverSignal)
    mythread.setRemoveSignal(removeSignal)
    mythread.setImageSignal(imageSignal)
    # flask_thread.finished.connect(QApplication.quit)
    # Start the thread
    mythread.start()
    return mythread


connections = {}


class QuizResponseThread(QThread):
    finished = pyqtSignal()
    serverSignal = None
    removeSignal = None
    imageSignal = None

    def setServerSignal(self, sig):
        self.serverSignal = sig

    def setRemoveSignal(self, sig):
        self.removeSignal = sig

    def setImageSignal(self, sig):
        self.imageSignal = sig

    def run(self):
        try:
            self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.serversocket.bind(('0.0.0.0', 4000))
            self.serversocket.listen(100)  # become a server socket, maximum 50 connections
            while True:
                connection, address = self.serversocket.accept()
                if address in connections:
                    print('player was already here!')
                    #connections[address].shutdown()
                addr = address[0]
                print(f"[*] Accepted connection from {address[0]}:{address[1]}:{addr}")

                connections[addr] = connection
                self.serverSignal.emit(address[0], 'RESP?:\t---')

                client_thread = threading.Thread(target=handle_client,
                                                 args=(connection, address, self.serverSignal, self.removeSignal,
                                                       self.imageSignal))
                client_thread.start()

                '''
                connection, address = self.serversocket.accept()
                buf = connection.recv(64)
                if len(buf) > 0:
                    print(address, buf)
                    self.serverSignal.emit(str(address[0]), buf.decode('utf-8'))
                '''
        except Exception as e:
            print(e)


def handle_client(client_socket, addr, serverSignal, removeSignal, imageSignal):
    #print(f"[*] Accepted connection from {addr[0]}:{addr[1]}")
    #serverSignal.emit(str(addr[0]), '?:%s\t0/0' % (addr[0]))
    buf = b''
    while True:
        try:
            buf = client_socket.recv(1024)
            if len(buf) > 0:
                print('handle_client', addr, buf)
                if buf[:4] == b'SCR\n':  #Screenshot
                    if len(buf) >= 8:
                        print(buf)
                        size = int.from_bytes(buf[4:8], 'big')
                        print("Image size:", size)
                        # Receive image data
                        image_data = buf[8:]
                        while len(image_data) < size:
                            chunk = client_socket.recv(size - len(image_data))
                            if not chunk:
                                return None
                            image_data += chunk
                        imageSignal.emit(image_data)
                        buf=b''
                else:  # Quiz Response
                    print('quiz resp', type(addr[0]))
                    serverSignal.emit(addr[0], buf[4:].decode('utf-8'))
                    buf = b''
            else:
                print('bye', addr)
        except socket.error:
            removeSignal.emit(addr[0])
            if addr[0] in connections:
                connections.pop(addr[0])
                return

        try:
            if not buf and addr[0] in connections:
                removeSignal.emit(addr[0])
                client_socket.close()
                connections.pop(addr[0])
                print(f"[*] Connection from {addr[0]}:{addr[1]} closed")
                removeSignal.emit(addr[0])
                return
        except Exception as e:
            print(e)
            removeSignal.emit(addr)
            return