File: quiz_server.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 (127 lines) | stat: -rw-r--r-- 4,627 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
125
126
127
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
                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''
    getting_screenshot = False
    while True:
        try:
            buf = client_socket.recv(100000)
            if len(buf) > 0:
                print('handle_client', addr, buf[:10])
                if buf[:4] == b'ABCD':  #Screenshot
                    getting_screenshot = True
                    print(buf)
                    buf+=client_socket.recv(1000)
                    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))
                        print(f'image data {len(image_data)}/{size}')
                        if not chunk:
                            getting_screenshot = False
                            continue
                        image_data += chunk
                    print('done capturing')
                    getting_screenshot = False
                    imageSignal.emit(addr[0],image_data)
                elif not getting_screenshot:  # Quiz Response
                    print('quiz resp', type(addr[0]))
                    serverSignal.emit(addr[0], buf.decode('utf-8'))
            else:
                print('bye', addr)
        except socket.error:
            print('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