Exemple #1
0
class BlockServer():
  def __init__(self, mysocket = None, MsgHandler = None):
    if mysocket is None:
      self.mysocket = MySocket()
    else:
      self.mysocket = mysocket
    self.msg_handler = MsgHandler
  
  def __init__(self, host, port, MsgHandler = None):
    self.mysocket = MySocket()
    self.host = host
    self.port = port
    self.msg_handler = MsgHandler
  
  def run_forever(self):
    print u'listening on ', self.host,':', self.port
    self.mysocket.bind(self.host, self.port)
    self.mysocket.listen(1)
    while True:
      sock, addr = self.mysocket.accept()
      if sock is not None:
        print 'connected by ', addr
      cli = MySocket(sock)
      requestHandler = RequestHandle(cli)
      requestHandler.Run()
Exemple #2
0
    def handler(self):
        # 开启 socket peek 功能。
        msock = MySocket(self.sock,True)

        # 解析 http 协议头
        request = httptool.HttpRequest(self.msock)
        request.parse_head()

        upgrade = request.headers.get('Upgrade').lower()
        if upgrade == "websocket":
            # websocket 协议
            # TODO: 这里不处理,收到服务器升级成功的回复后在处理
            request.del_conntype(retain=['Upgrade'])
        elif upgrade is not None:
            # 存在未知的升级协议
            if self.porxy is False and self.remote_host and self.remote_port:
                # 非代理模式,对未知的协议直接转发。
                msock.reset_peek_offset()
                msock.set_peek(False)
                # 对外发起请求
                try:
                    remote_sock = self.server.upstream.create_connection((self.remote_host,self.remote_port),)
                except:
                    logging.exception(u'连接 tcp host:%s port:%s 失败。'%(self.remote_host,self.remote_port))
                    self.msock.close()
                    return
                self.forward(self.sock,remote_sock,5*60)
                return
            else:
                # 代理模式,删除各种未知的协议
                request.del_conntype(retain=[])
                del request.headers['Upgrade']

        try:
            remote_sock = self.server.upstream.get_http_conn(request.get_http_host_address())
        except:
            logging.exception(u'所有线路连接 tcp host:%s port:%s 失败。'%(self.remote_host,self.remote_port))
            self.msock.close()
            return

        remote_sock.sendall(request.get_head_string())
        #TODO: 另开一个线程接受回应。
        #TODO: 这里就要开始接受回应,有可能客户端在等待 100-continue 回应。
        body = request.get_body()
        while True:
            data = body.recv(2**16)
            if data:
                remote_sock.sendall(data)
            else:
                break
        # 大概做法,接收请求,建立新连接并发出请求,然后将回应丢到回应队列里面去
        # 回应队列限制长度,如果满了就阻塞添加到队列操作。
        # 需要注意,碰到post请求就需要另开一个新连接,不要使用线程池里面的。
        # 同时需要等待之前的请求完结之后在处理post请求。


        raise  NotImplementedError(u'未完成')
        remote_sock
Exemple #3
0
 def connect(self):
     strings = self.entry.get()
     if (self.is_connected):
         messagebox.showwarning("FAIL TO ATTEMPT", "Already Connected")
         return
     #print(strings)
     try:
         self.socket = MySocket((strings, PORT))
         messagebox.showinfo("SUCCESS", "Connected")
         self.is_connected = True
     except:
         messagebox.showerror("ERROR", "Can not connect")
 def __init__(self, machine, machine_list):
     self.pid = machine
     self.pid_list = machine_list
     self.ltime = 0
     self.reqtime = 0
     self.local_queue = []
     self.ack_list = {}
     self.mysocket = MySocket(self)
     self.mysocket.start_server(machine=machine)
Exemple #5
0
def main():
  serverList = cf.GetServerList('./serverlist.txt')
  print u'找到',len(serverList), u'个服务器地址:'
  for addr in serverList:
    print addr

  print ''
  for addr in serverList:
    try:
      s = MySocket()
      s.connect(addr[0], addr[1])
      svrSockets.append(s)
    except:
      print u'Error: 连接', addr, u'失败'
   
 # print 'golbal queue:', g_messageQueues
 # print 'global socket list size', len(svrSockets)
 # print 'svrsocklist ', svrSockets
  network_thread = threading.Thread(target = networkThreadHandler, args = (g_messageQueues, svrSockets))
  userInput_thread = threading.Thread(target = userInputThreadHandler, args =(g_messageQueues, svrSockets))
  network_thread.start()
  userInput_thread.start()
  while True:
    OnQueueMsg(g_messageQueues['main'].get())
Exemple #6
0
def inicializarServidor():
    # Programa comienza aquí.
    # ref: https://docs.python.org/3/howto/sockets.html
    # Se define el socket del servidor.
    print("Creando socket")
    socket_servidor = MySocket()
    socket_servidor.bind(hostname='localhost',port=8081)
    socket_servidor.listen(number_connections=5)
    print("Socket creado, asociado al hostname '{}', puerto '{}' y número de conexiones '{}'".format('localhost',8081,5))
    
    while True:
        # Apenas se establece una conexión, se maneja apropiadamente.
        (socket_cliente, address) = socket_servidor.accept()
        # El socket obtenido en socket_cliente establece la conexión punto a punto
        # con el estacionamiento que va a enviarnos la información. Es una instancia
        # de socket.py
        
        # Recibir e imprimir lo que obtenemos del socket.
        print("Dirección IP: {}".format(address))
        # mensaje = socket_cliente.myreceive()
        mensaje_dict = socket_cliente.receive()
        print("Mensaje: {}".format(mensaje_dict))
class Node(SockListener):
    
    FILENAME = "out"

    def __init__(self, machine, machine_list):
        self.pid = machine
        self.pid_list = machine_list
        self.ltime = 0
        self.reqtime = 0
        self.local_queue = []
        self.ack_list = {}
        self.mysocket = MySocket(self)
        self.mysocket.start_server(machine=machine)

    def check_ack_list(self):
        flag = True
        for p in self.pid_list:
            if p==self.pid:
                continue
            ack_time = self.ack_list.get(p, -1)
            if ack_time<=self.reqtime:
                flag = False
        return flag

    def onReceive(self, data):
        ltime, pid, typ = data
        ltime = int(ltime)
        self.ltime = 1+max(self.ltime, int(ltime))

        if typ=='Request':
            heapq.heappush(self.local_queue, [str(ltime), pid, "Request"])
            self.mysocket.send_message(pid, '%d,%s,%s'%(self.ltime,self.pid,"ACK"), "ACK")
            print >>sys.stderr, "\nChanging the local timestamp to %d"%self.ltime
        elif typ=='ACK':
            self.ack_list[pid] = ltime
            if self.check_ack_list()==True:
                ltime, p, evt = heapq.heappop(self.local_queue)
                if p==self.pid:
                    print "\n*****Granted resource access to current process(%s)*****"%p
                else:
                    heapq.heappush(self.local_queue, [ltime, p, evt])
            print >>sys.stderr, "\nChanging the local timestamp to %d"%self.ltime
        elif typ=='Release':
            #release the pid accessing critical section which will be on the top
            self.ack_list[pid] = ltime
            if self.local_queue:
                heapq.heappop(self.local_queue)

            #check if next pid on the heap is current pid, if it is current pid then grant access
            if self.local_queue:
                ltime, p, evt = heapq.heappop(self.local_queue)
                if p==self.pid and self.check_ack_list()==True:
                    print "\n*****Granted resource access to current process(%s)*****"%p
                else:
                    heapq.heappush(self.local_queue, [ltime, p, evt])

        print >>sys.stderr, "\nLocal timestamp to %d"%self.ltime
        sys.stderr.write('\n[PROMPT]Input(rq:Request, rl:Release)# ')
        return

    def onStandardInput(self, data):
        inp = data.strip()
        if inp=="rq":
            self.request_resource("out")
        elif inp=='rl':
            self.release_resource("out")

    def request_resource(self,filename):
        for pid in self.pid_list:
            l = [str(self.ltime), self.pid, 'Request']
            if pid==self.pid:
                self.reqtime = self.ltime
                heapq.heappush(self.local_queue, l)
            else:
                heapq.heappush(self.local_queue, l)
                self.mysocket.send_message(pid, ','.join(l), l[2])
        self.ltime = self.ltime + 1
        print >>sys.stderr, "\nLocal timestamp to %d"%self.ltime
 
    def release_resource(self,filename):
        for pid in self.pid_list:
            if pid==self.pid:
                heapq.heappop(self.local_queue)
            else:
                self.mysocket.send_message(pid, '%d,%s,%s'%(self.ltime,self.pid,"Release"), "Release")
        self.ltime = self.ltime + 1
        print >>sys.stderr, "\nLocal timestamp to %d"%self.ltime
        self.ack_list.clear()
Exemple #8
0
    def handle(self, sock, addr):
        logging.debug(u'connection from %s:%s' % addr)

        # 调用各个 handler 尝试生成 client
        #  检查结果,如果生成了就表示本次客户端请求的是这个协议。
        #      剩下的就交由这个协议处理。

        _handler = None
        _reset_peek_offset = False
        mysocket = MySocket(sock)

        for Handler in handler.get_handler():
            mysocket.reset_peek_offset()
            (_handler, _reset_peek_offset) = Handler.create(mysocket, self)
            if _handler is not None:
                break

        if _handler is None:
            mysocket.close(safe=False)
            logging.warn(u'[Handler]收到未识别的协议,关闭连接。')
            return

        try:
            if _reset_peek_offset:
                mysocket.reset_peek_offset()

            mysocket.set_peek(False)

            # handler 有可能是异步调用
            _handler.handler()
        except:
            logging.exception(u'client.handle()')
            mysocket.close(safe=False)
Exemple #9
0
class Player:
    def __init__(self):
        self.socket = 0
        self.level = 1
        self.food = 1260
        self.stones = {
            "linemate": 0,
            "deraumere": 0,
            "sibur": 0,
            "mendiane": 0,
            "phiras": 0,
            "thystame": 0
        }
        self.team_name = ""
        self.dir = -1
        self.needed_list = []
        self.last_move = ""
        self.inventory = []
        self.following = 0
        self.next_dir = []

    def connect(self, infos):
        self.socket = MySocket(infos["machine"], int(infos["port"]))
        return (self.socket.connect())

    def init_player(self, infos):
        self.team_name = infos["name"]
        self.connect(infos)

    def preliminaries(self):
        self.parse_rcv_msg(None)
        self.socket.send_msg(self.team_name)
        if self.parse_rcv_msg(None) == "ko":
            exit(0)

    def Look(self):
        self.socket.send_msg("Look")
        map = self.parse_rcv_msg("Look")
        return (map)

    def check_needed_object(self):
        self.needed_list = []
        for stone in all_stones:
            if self.stones[stone] < need_stones[self.level][stone]:
                self.needed_list.append(stone)

    def make_move(self):
        directions = self.next_dir
        for direction in directions:
            self.socket.send_msg(direction)
            msg = self.parse_rcv_msg("Join Player")
            while msg != "ok":
                msg = self.parse_rcv_msg("Join Player")
        self.next_dir = []

    def handle_broadcast(self, tab_msg):
        for msg in tab_msg:
            if (("ready" in msg) and (self.dir != 0)):
                tab = msg.split(":")
                if (int(tab[1]) == self.level):
                    if (int(tab[2]) == self.following):
                        tmp = tab[0].split(" ")[1]
                        self.dir = int(tmp.split(",")[0])
                        self.next_dir = dir_tab[self.dir]
                        if debug:
                            print("JE SUIS LE JOUEUR AVEC L'ID",
                                  self.following, "Tab =", self.next_dir,
                                  "Dir =", self.dir)
                    elif (self.following == 0):
                        self.following = int(tab[2])
                        tmp = tab[0].split(" ")[1]
                        self.dir = int(tmp.split(",")[0])
                        self.next_dir = dir_tab[self.dir]
                        if debug:
                            print("JE COMMENCE A SUIVRE", tab[2], "Tab =",
                                  self.next_dir, "Dir =", self.dir)
            elif ("start" in msg):
                tab = msg.split(":")
                if (int(tab[1]) == self.level):
                    tmp = tab[0].split(" ")[1]
                    if (int(tab[2]) == self.following and self.dir != 0):
                        self.dir = -1
                        self.following = 0
                    elif (int(tab[2]) == self.following):
                        self.dir = int(tmp.split(",")[0])

    def parse_rcv_msg(self, command):
        msg = self.socket.rcv_msg()
        tab_msg = msg.split("\n")
        broadcast = []
        msg_final = ""
        for tab in tab_msg:
            if (len(tab) == 0):
                continue
            elif "message" in tab:
                broadcast.append(tab)
            elif "Current level" in tab:
                self.level = self.level + 1
                self.dir = -1
                msg_final = tab
            else:
                msg_final = tab
        self.handle_broadcast(broadcast)
        if (len(msg_final) == 0):
            msg_final = self.parse_rcv_msg(command)
        elif (command != None
              and (("Look" in command) or ("Inventory" in command))
              and (msg_final[0] != "[")):
            msg_final = self.parse_rcv_msg(command)
        return msg_final

    def move(self, i):
        if debug:
            print("Je vais vers une pierre")
        average = 0
        j = 0
        moves = []
        for vision in visions:
            if (i > vision):
                j = j + 1
        if (((visions[j] + (visions[j - 1])) % 2) == 1):
            average = (visions[j] + (visions[j - 1] + 1)) / 2
        else:
            average = (visions[j] + (visions[j - 1])) / 2
        while j > 0:
            moves.append("Forward")
            j = j - 1
        if (i < average):
            moves.append("Left")
            while i < average:
                moves.append("Forward")
                i = i + 1
        elif (i > average):
            moves.append("Right")
            while i > average:
                moves.append("Forward")
                i = i - 1
        self.next_dir = moves

    def take_food(self, view):
        tabs = view.split(", ")
        nb_food = 0
        while tabs[0].find("food") != -1 and self.dir == -1:
            self.socket.send_msg("Take food")
            msg = self.parse_rcv_msg("Join Player")
            if msg == "ko" or nb_food > 10:
                break
            nb_food += 1

    def choose_action(self, view):
        tabs = view.split(", ")
        for need in self.needed_list:
            i = 0
            for tab in tabs:
                if (tab.find(need) != -1 and self.dir == -1):
                    if (i == 0):
                        self.socket.send_msg("Take " + need)
                        self.parse_rcv_msg("Take")
                        return
                    else:
                        self.move(i)
                        return
                i = i + 1
        self.move_random()

    def check_inventory(self):
        self.socket.send_msg("Inventory")
        self.inventory = self.parse_rcv_msg("Inventory")
        tab = self.inventory.split(", ")
        for stone in tab:
            stone_name = stone.split(" ")
            if ((stone_name[0] != "food") and (stone_name[0] != "[")):
                self.stones[stone_name[0]] = int(stone_name[1])

    def move_random(self):
        if debug:
            print("Move random")
        rnd = random.Random()
        if (self.last_move == "Left"):
            move = rnd.choice(["Forward", "Right"])
        elif (self.last_move == "Right"):
            move = rnd.choice(["Forward", "Left"])
        else:
            move = rnd.choice(["Forward", "Left", "Right"])
        self.last_move = move
        self.next_dir = [move]

    def drop_inventory(self):
        for stone in all_stones:
            needed = need_stones[self.level][stone]
            while needed > 0:
                self.socket.send_msg("Set " + stone)
                msg = self.parse_rcv_msg("Set")
                if msg == "ok":
                    needed = needed - 1
                else:
                    break

    def take_other_stones(self):
        view = self.Look()
        tabs = view.split(", ")
        for stone in all_stones:
            while tabs[0].find(stone) != -1:
                self.socket.send_msg("Take " + stone)
                if self.parse_rcv_msg("Take") == "ko":
                    break

    def make_incantation(self):
        self.following = randint(1000, 10000)
        if (self.level >= 2):
            while (self.check_nb_player_tile() == 0):
                if debug:
                    print("self.level = ", self.level)
                    print("(need_stones[self.level][\"player\"] - 1) = ",
                          (need_stones[self.level]["player"] - 1))
                self.socket.send_msg("Broadcast ready for incantation :" +
                                     str(self.level) + ":" +
                                     str(self.following))
                self.parse_rcv_msg("Broadcast")
        self.socket.send_msg("Broadcast start incantation :" +
                             str(self.level) + ":" + str(self.following))
        self.parse_rcv_msg("Broadcast")
        self.take_other_stones()
        self.drop_inventory()
        self.eject_player()
        view = self.Look()
        if (self.check_nb_player_tile() == 1):
            self.socket.send_msg("Incantation")
            msg = self.parse_rcv_msg("Incantation")
            msg = self.parse_rcv_msg("Incantation")
        self.following = 0
        self.dir = -1

    def check_nb_player_tile(self):
        view = self.Look()
        player_tile = view.split(",")[0][1:]
        all_objects = player_tile.split(" ")
        need_player = need_stones[self.level]["player"]
        for obj in all_objects:
            if obj == "player":
                if (need_player > 0):
                    need_player -= 1
        if (need_player == 0):
            return (1)
        elif (need_player > 0):
            return (0)

    def eject_player(self):
        view = self.Look()
        player_tile = view.split(",")[0][1:]
        all_objects = player_tile.split(" ")
        need_player = need_stones[self.level]["player"]
        for obj in all_objects:
            if obj == "player":
                if (need_player > 0):
                    need_player -= 1
                else:
                    self.socket.send_msg("Eject")
                    msg = self.socket.rcv_msg()
                    self.socket.send_msg("Forward")
                    self.parse_rcv_msg("Forward")
                    return

    def wait_incantation(self):
        msg = ""
        if self.dir == 0:
            lvl = self.level
            while ((self.level == lvl)):
                msg = self.parse_rcv_msg("wait incantation")
                if ("ko" in msg):
                    break
            self.dir = -1
            self.following = 0

    def play(self):
        self.preliminaries()
        while 1:
            if debug:
                print(">> play LEVEL =", self.level, "\n\n\n")
            self.wait_incantation()
            self.check_inventory()
            self.check_needed_object()
            if ((not self.needed_list) and self.following == 0):
                self.make_incantation()
            else:
                view = self.Look()
                self.take_food(view)
                if (self.dir == -1):
                    self.choose_action(view)
                if ((len(self.next_dir) != 0)
                        and (len(self.next_dir[0]) != 0)):
                    print("Make move : ", self.next_dir)
                    self.make_move()
Exemple #10
0
 def connect(self, infos):
     self.socket = MySocket(infos["machine"], int(infos["port"]))
     return (self.socket.connect())
Exemple #11
0
    def handle(self, sock, addr):
        logging.debug(u'connection from %s:%s' % addr)

        # 调用各个 handler 尝试生成 client
        #  检查结果,如果生成了就表示本次客户端请求的是这个协议。
        #      剩下的就交由这个协议处理。

        _handler = None
        _reset_peek_offset = False
        mysocket = MySocket(sock)

        for Handler in handler.get_handler():
            mysocket.reset_peek_offset()
            (_handler, _reset_peek_offset) = Handler.create(mysocket, self)
            if _handler is not None:
                break

        if _handler is None:
            mysocket.close(safe=False)
            logging.warn(u'[Handler]收到未识别的协议,关闭连接。')
            return

        try:
            if _reset_peek_offset:
                mysocket.reset_peek_offset()

            mysocket.set_peek(False)

            # handler 有可能是异步调用
            _handler.handler()
        except:
            logging.exception(u'client.handle()')
            mysocket.close(safe=False)
Exemple #12
0
#0000 acceso no restringido
#pdb.set_trace()
# Funciones
def leer_placa():
    placa = input("Placa: ")
    return placa
def leer_ticket():
    ticket = input("ticket: ")
    resgistrado = input("registrado(True,False): ")
    return ticket, resgistrado

# Programa comienza aquí.
# ref: https://docs.python.org/3/howto/sockets.html
# Crear un socket como cliente.
print("Creando socket")
socket_cliente = MySocket()
socket_cliente.connect(host=HOST, port=PORT)
print("Socket conectado.")

# Enviar primer mensaje:
# Estructura del primer mensaje:
# * RIF: lleno
# * ticket: None.
# * placa: llena.
# * tipo: llena ('placa_leida')
# * puerta: llena.
# * lectura_automatica: llena, sus posibles valores son:
            # True: lectura realizada de forma automática
            # False: lentura realizada de forma manual
            # None: No aplica la información (ejemplo, mensajes servidor-cliente)
# * registrado: llena, true o false
Exemple #13
0
 def __init__(self, host, port, MsgHandler = None):
   self.mysocket = MySocket()
   self.host = host
   self.port = port
   self.msg_handler = MsgHandler
Exemple #14
0
 def __init__(self, mysocket = None, MsgHandler = None):
   if mysocket is None:
     self.mysocket = MySocket()
   else:
     self.mysocket = mysocket
   self.msg_handler = MsgHandler
Exemple #15
0
class Main(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.is_connected = False
        self.master.title("Client")
        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_columnconfigure(0, weight=1)
        self.master.resizable(False, False)
        self.grid()
        self.socket = None
        self.is_running = False
        self.subroot = [None] * 6
        self.create_widgets()

    def create_widgets(self):
        self.entry = tk.Entry(self, width=50)
        self.entry.grid(row=0, column=0, columnspan=5, padx=10, pady=10)
        self.contents = tk.StringVar(self)
        self.contents.set("Nhập địa chỉ IP")
        self.entry["textvariable"] = self.contents
        self.Connect = tk.Button(self, text="Connect", width=10, height=1)
        self.Connect.grid(row=0, column=5, sticky=tk.NE, padx=10, pady=10)
        self.Connect['command'] = self.connect
        self.Screenshot = tk.Button(self,
                                    text="ScreenShot",
                                    height=2,
                                    width=10)
        self.Screenshot.grid(row=1, column=0, sticky=tk.NW, padx=10, pady=10)
        self.Screenshot["command"] = self.create_screenshot
        self.Keystroke = tk.Button(self, text="KeyStroke", width=10, height=2)
        self.Keystroke.grid(row=2, column=0, sticky=tk.NW, padx=10, pady=10)
        self.Keystroke['command'] = self.create_keystroke
        self.Process_Running = tk.Button(self,
                                         text="Process Running",
                                         width=10,
                                         height=10,
                                         wraplength=50)
        self.Process_Running.grid(row=1, column=1, rowspan=2, padx=10, pady=10)
        self.Process_Running["command"] = self.create_process_running
        self.App_Running = tk.Button(self,
                                     text="App Running",
                                     width=10,
                                     height=10,
                                     wraplength=50)
        self.App_Running.grid(row=1, column=2, rowspan=2, padx=10, pady=10)
        self.App_Running["command"] = self.create_app_running
        self.Registry = tk.Button(self, text='Registry', width=10, height=2)
        self.Registry.grid(row=1, column=4, padx=10, pady=10, sticky=tk.NE)
        self.Registry["command"] = self.create_registry_running
        self.master.protocol("WM_DELETE_WINDOW", self.on_exit)
        self.Shutdown = tk.Button(self, text="Shut down", width=10, height=2)
        self.Shutdown.grid(row=2, column=4, pady=10, padx=10, sticky=tk.NE)
        self.Shutdown["command"] = self.create_shutdown

    def create_shutdown(self):
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("SHUTDOWN", "utf8"))

    def create_registry_running(self):
        if self.check():
            return
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("REGISTRY", "utf8"))
        registryroot = tk.Toplevel(self.master)
        self.subroot[4] = Registry_UI(registryroot, self.socket)
        self.subroot[4].mainloop()

    def create_app_running(self):
        if self.check():
            return
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("APP", "utf8"))
        approot = tk.Toplevel(self.master)
        self.subroot[3] = Manager_ui(approot, self.socket, "App")
        self.subroot[3].mainloop()

    def create_process_running(self):
        if self.check():
            return
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("PROCESS", "utf8"))
        processroot = tk.Toplevel(self.master)
        self.subroot[2] = Manager_ui(processroot, self.socket, "Process")
        self.subroot[2].mainloop()

    def create_keystroke(self):
        if self.check():
            return
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("KEYSTROKE", "utf8"))
        keystrokeroot = tk.Toplevel(self.master)
        self.subroot[0] = keystroke_ui(keystrokeroot, self.socket)
        self.subroot[0].mainloop()

    def create_screenshot(self):
        if self.check():
            return
        if not self.is_connected:
            messagebox.showerror("FAIL TO ATTEMPT", "NOT CONNECTED YET")
            return
        self.socket.client.sendall(bytes("SCRSHOT", "utf8"))
        screenshotroot = tk.Toplevel(self.master)
        self.subroot[1] = scrshot_ui(screenshotroot, self.socket)
        self.subroot[1].mainloop()

    def connect(self):
        strings = self.entry.get()
        if (self.is_connected):
            messagebox.showwarning("FAIL TO ATTEMPT", "Already Connected")
            return
        #print(strings)
        try:
            self.socket = MySocket((strings, PORT))
            messagebox.showinfo("SUCCESS", "Connected")
            self.is_connected = True
        except:
            messagebox.showerror("ERROR", "Can not connect")

    def on_exit(self):
        if self.check():
            return
        if self.socket is None:
            self.master.destroy()
            return
        try:
            self.socket.client.sendall(bytes("exit", "utf8"))
        except:
            dem = 1
        self.socket.close()
        self.master.destroy()

    def check(self):
        for i in range(6):
            if self.subroot[i] is not None and self.subroot[i].winfo_exists():
                return True
        return False
Exemple #16
0
    def handler(self):
        # 开启 socket peek 功能。
        msock = MySocket(self.sock, True)

        # 解析 http 协议头
        request = httptool.HttpRequest(self.msock)
        request.parse_head()

        upgrade = request.headers.get('Upgrade').lower()
        if upgrade == "websocket":
            # websocket 协议
            # TODO: 这里不处理,收到服务器升级成功的回复后在处理
            request.del_conntype(retain=['Upgrade'])
        elif upgrade is not None:
            # 存在未知的升级协议
            if self.porxy is False and self.remote_host and self.remote_port:
                # 非代理模式,对未知的协议直接转发。
                msock.reset_peek_offset()
                msock.set_peek(False)
                # 对外发起请求
                try:
                    remote_sock = self.server.upstream.create_connection(
                        (self.remote_host, self.remote_port), )
                except:
                    logging.exception(u'连接 tcp host:%s port:%s 失败。' %
                                      (self.remote_host, self.remote_port))
                    self.msock.close()
                    return
                self.forward(self.sock, remote_sock, 5 * 60)
                return
            else:
                # 代理模式,删除各种未知的协议
                request.del_conntype(retain=[])
                del request.headers['Upgrade']

        try:
            remote_sock = self.server.upstream.get_http_conn(
                request.get_http_host_address())
        except:
            logging.exception(u'所有线路连接 tcp host:%s port:%s 失败。' %
                              (self.remote_host, self.remote_port))
            self.msock.close()
            return

        remote_sock.sendall(request.get_head_string())
        #TODO: 另开一个线程接受回应。
        #TODO: 这里就要开始接受回应,有可能客户端在等待 100-continue 回应。
        body = request.get_body()
        while True:
            data = body.recv(2**16)
            if data:
                remote_sock.sendall(data)
            else:
                break
        # 大概做法,接收请求,建立新连接并发出请求,然后将回应丢到回应队列里面去
        # 回应队列限制长度,如果满了就阻塞添加到队列操作。
        # 需要注意,碰到post请求就需要另开一个新连接,不要使用线程池里面的。
        # 同时需要等待之前的请求完结之后在处理post请求。

        raise NotImplementedError(u'未完成')
        remote_sock