2014-03-27 71 views
0

我一直在用python套接字线程发送一个字符串图像来争取一段时间,并且在这个问题上没有运气。为客户端python 2.7线程没有正确运行

代码是:

import socket 
from PIL import ImageGrab #windows only screenshot 
from threading import Thread 
import win32api, win32con 
import re 
import win32com.client 
import getpass 
import time 
import select 
shell = win32com.client.Dispatch("WScript.Shell") 
host = raw_input("SERVER:") 
dm = win32api.EnumDisplaySettings(None, 0) 
dm.PelsHeight = 800 
dm.PelsWidth = 600 
win32api.ChangeDisplaySettings(dm, 0) 
port = 9000 

def picture(): 
    while 1: 
     image = ImageGrab.grab().resize((800,600)) #send screen as string 
     data = image.tostring() 
     sendme = (data) 
     try: 
      s.sendall(sendme) 
      print ("sent") 
     except socket.error as e: 
      print e 
     except Exception as e: 
      print e 



s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 
pict = Thread(target=picture) 
pict.start() 
while 1: 
    socket_list = [s] 
    # Get the list sockets which are readable 
    read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])   
    for sock in read_sockets: 
     if sock == s: 
       data = sock.recv(1024) 
       print data 
       if "LEFTC" in data: 
        data = data.replace("LEFTC","") 
        x = re.findall(r'X(.*?)Y',data) 
        y = re.findall(r'Y(.*?)EOC',data) 
        x = str(x) 
        y = str(y) 
       #REPLACE CODE TO BE REWRITTEN 
        x = x.replace("[","").replace("]","").replace("'","").replace(" ","") 
        y = y.replace("[","").replace("]","").replace("'","").replace(" ","") 
        print(str(x) + ' X\n') 
        print(str(y) + ' Y\n') 
        try: 
          win32api.SetCursorPos((int(x),int(y))) #click time 
          win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,int(x),int(y),0,0) 
          win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,int(x),int(y),0,0) 
        except Exception as e: 
          print e 
       elif "RIGHTC" in data: 
        data = data.replace("RIGHTC","") 
        x = re.findall(r'X(.*?)Y',data) 
        y = re.findall(r'Y(.*?)EOC',data) 
        x = str(x) 
        y = str(y) 
       #REPLACE FUNCTION MAREKD FOR REWRITE 
        x = x.replace("[","").replace("]","").replace("'","").replace(" ","") 
        y = y.replace("[","").replace("]","").replace("'","").replace(" ","") 
        print(str(x) + ' X\n') 
        print(str(y) + ' Y\n') 
        try: #click 
          win32api.SetCursorPos((int(x),int(y))) 
          win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN,int(x),int(y),0,0) 
          win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP,int(x),int(y),0,0) 
        except Exception as e: 
          print e 
       else: 
       #This does not work correctly: only BACKSPACE and the else are working. 
        if "CAPS" in data: 
          shell.SendKeys('{CAPSLOCK}') 
        elif "CAPSOFF" in data: 
          shell.SendKeys('{CAPSLOCK}') 
        elif "BACKSPACE" in data: 
          shell.SendKeys('{BACKSPACE}') 
        elif "SHIFT" in data: 
          shell.SendKeys('+' + data) 
        else: 
          shell.SendKeys(data) 
       time.sleep(0.1) 

服务器代码是:

import socket 
import pygame 
from pygame.locals import * 
from threading import Thread 
x = y = 0 
host = "" 
#port defined here 
port = 9000 
#This list is used to make the library more pythonic and compact. This also leads to less source code. 
keylist = [pygame.K_a,pygame.K_b,pygame.K_c,pygame.K_d,pygame.K_e,pygame.K_f,pygame.K_g,pygame.K_h,pygame.K_i,pygame.K_j,pygame.K_k,pygame.K_l,pygame.K_m,pygame.K_n,pygame.K_o,pygame.K_p,pygame.K_q,pygame.K_r,pygame.K_s,pygame.K_t,pygame.K_u,pygame.K_v,pygame.K_w,pygame.K_x,pygame.K_y,pygame.K_z] 
key = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','1','2','3','4','5','6','7','8','9','0'] 

I/O功能

def ioinput(sock): 
    while 1: 
     evt = pygame.event.poll() #has to be in the same while loop as the evt called or wont work. 
     if evt.type == pygame.MOUSEBUTTONDOWN and evt.button == 1: # one for left 
      x, y = evt.pos 
      command = ("LEFTC" + " " + "X" + str(x) + "Y" + str(y) + "EOC") 
      sock.sendall(command) 
     elif evt.type == pygame.MOUSEBUTTONDOWN and evt.button == 3: # 3 for right 2 is middle which support comes for later. 
      x, y = evt.pos 
      command = ("RIGHTC" + " " + "X" + str(x) + "Y" + str(y) + "EOC") 
      sock.sendall(command) 
     elif evt.type == pygame.KEYDOWN: 
      keyname = pygame.key.name(evt.key) 
      if evt.key == pygame.K_BACKSPACE: 
       command = ("BACKSPACE") 
       sock.sendall(command) 
      elif evt.key in keylist: 
       if keyname in key: 
        command = (keyname) 
        sock.sendall(command) 
def mainloop(): 
    message = [] 
    while 1: 
     try: 
      while True: 
       try: 
        conn, addr = server.accept() 
        except socket.error: 
         break 
      screen = pygame.display.set_mode((800,600)) 
      clickctrl = Thread(target=ioinput, args=(conn,)) 
      clickctrl.start() 
      while 1: 
       d = conn.recv(1024*1024*1) 
       if not d: 
        break 
       else: 
        message.append(d) 
       data = ''.join(message) 
       image = pygame.image.frombuffer(data,(800,600),"RGB") 
       screen.blit(image,(0,0)) 
       pygame.display.flip() 
     except Exception as e: 
      continue 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
server.setblocking(False) 
server.bind((host, port)) 
server.listen(55000) 
print "Listening on %s" % ("%s:%s" % server.getsockname()) 

主事件循环。

mainloop() 

图片线程将运行3到6次然后死亡,但键盘和鼠标输入层继续运行。我怀疑GIL正在妨碍我。我是正确还是错过了一些非常简单的东西?这个程序应该是一个简单的反向远程桌面应用程序。

回答

0

我和一位好朋友说话后发现问题。事实证明,我的服务器端while循环安装,以便它会中断。

我固定这通过改变:

 while 1: 
      d = conn.recv(1024*1024*1) 
      if not d: 
       break 
      else: 
       message.append(d) 
      data = ''.join(message) 
      image = pygame.image.frombuffer(data,(800,600),"RGB") 
      screen.blit(image,(0,0)) 
      pygame.display.flip() 

到:

while 1: d = conn.recv(1024*1024*1) message.append(d) try: print("attempting to parse..") data = ''.join(message) image = pygame.image.frombuffer(data,(800,600),"RGB") screen.blit(image,(0,0)) pygame.display.flip() print("recieved pic") except Exception as e: print e continue

此外,画面线程上的客户端i上异常处理之后添加一个time.sleep(1),否则图像不正确。