python 2.7线程无法正常运行

时间:2014-03-27 12:09:23

标签: multithreading python-2.7

我一直在使用python套接字上的字符串图像的线程发送一段时间,并且在这个问题上没有运气。

客户端的代码是:

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正在妨碍我。我是正确的还是我错过了一些非常简单的东西?该程序应该是一个简单的反向远程桌面应用程序。

1 个答案:

答案 0 :(得分: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

此外,在图片线程上的客户端我在异常处理后添加了time.sleep(1),否则图像无法正常显示。