This is my first experiment with sockets. Its kinda like the beginings of a VNC app. The basic gist is that one file on computer "A" takes a screenshot of the computer screen and sends it to computer "B" where another file accepts the connection and receives the data. Computer "B" then takes the image data and, using wxpython, displays the image refreshing the picture whenever a new image is received.
My goal is to make the images on computer "B" to look like a low frame rate video (without the annoying white flash that occurs every refresh). I'll also take any tips on how to improve my networking code.
# Client program from time import sleep from socket import * from screenshot import * IP = "localhost" port = 10000 while 1: try: print 'sending image to port %i'%port s = socket(AF_INET, SOCK_STREAM) s.settimeout(10.0) s.connect((IP, port)) s.sendall(TakeScreenShot()) s.recv(1024) s.close() sleep(0.07) except Exception, e: print e
file 2 (screenshot.py)
# -*- coding: utf-8 -*- from ImageGrab import grab from StringIO import StringIO def TakeScreenShot(): Image = grab() Buffer = StringIO() Image.save(Buffer, format = 'JPEG') return Buffer.getvalue()
file 3 (Image Receiver/Viewer):
# -*- coding: utf-8 -*- import wx from time import sleep from threading import Thread from traceback import format_exc as E from StringIO import StringIO from socket import * WIDTH = 1430 HEIGHT = 860 IP = "localhost" port = 10000 class MainFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title = 'Image Viewer', pos = (0,0), size = (WIDTH, HEIGHT)) self.bg = wx.Panel(self) pic = wx.EmptyBitmap(WIDTH-20, HEIGHT-60) self.ScreenShot = wx.StaticBitmap( self.bg, -1, pic, pos = (0, 0), size = (WIDTH-20, HEIGHT-60) ) self.screenX, self.screenY = self.ScreenShot.GetSize() self.Show() self.bg.Layout() self.Listen() def Listen(self): self.ListeningSocket = NewThread(port) def RefreshPicture( self, data ): self.ScreenShot.Show(False) stream = StringIO( data ) img = wx.ImageFromStream(stream) img = img.Scale(*self.ScreenShot.GetSize()) bitmap = wx.BitmapFromImage(img) self.ScreenShot.SetBitmap(bitmap) self.ScreenShot.Show(True) class NewThread(Thread): def __init__(self, port): self.port = port Thread.__init__ ( self ) self.start() def start(self): Thread.start(self) def run(self): try: while 1: self.s = socket(AF_INET, SOCK_STREAM) self.s.bind((IP, self.port)) self.s.listen(5) print "listening on port %i"%self.port # wait for client to connect connection, address = self.s.accept() while 1: try: # buffer large enough to receive pictures data = connection.recv(1048576) if data: print "data received" window.RefreshPicture(data) connection.send("received") connection.close() break except Exception, e: print "socket error:", e except Exception, e: print "socket error:", e try: app = wx.App(redirect=False) window = MainFrame() app.MainLoop() finally: del app