Python设置Socket代理及实现远程摄像头控制的例子


Posted in Python onNovember 13, 2015

为python设置socket代理
首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-packages中.或者把这个文件复制到程序所在的目录中.
然后就可以再程序中使用socket代理来编写程序了.
下面是示例代码

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",8088)
socket.socket =socks.socksocket
import urllib2
urllib2.urlopen('http://www.baidu.com').read()

通过socket通信实现远程摄像头监控
通过python来实现摄像头监控,然后通过socket通信来将数据发送到远程服务器,这样就可以实现远程监控了.大概找了下资料,果然可以,下面贴出实现过程.
这个程序包括一个服务器和一个客户端。需要的库有 VideoCapture 和 pygame,一个用来得到摄像头的视频,一个用来显示.
服务器端,主要实现监听客户端所发送到指令,如果指令是startCam,则打开摄像头,并向客户端发送数据.

from VideoCapture import Device
import ImageDraw, sys, pygame, time
from pygame.locals import *
import socket
import time
from PIL import ImageEnhance
from threading import Thread
import traceback
import threading

 
 


# 全局变量
is_sending = False
cli_address = ('', 0)

# 主机地址和端口
host = 'localhost'
port = 10218

# 初始化UDP socket
ser_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ser_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ser_socket.bind((host, port))

# 接收线程类,用于接收客户端发送的消息
class UdpReceiver(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.thread_stop = False
        
  def run(self):
    while not self.thread_stop:
      # 声明全局变量,接收消息后更改
      global cli_address  
      global is_sending
      try:
        message, address = ser_socket.recvfrom(2048)
      except:
        traceback.print_exc()
        continue
      print message,cli_address
      cli_address = address
      if message == 'startCam':
        print 'start camera',
        is_sending = True
        ser_socket.sendto('startRcv', cli_address)        
      if message == 'quitCam':
        is_sending = False
        print 'quit camera',

  def stop(self):
    self.thread_stop = True


if __name__=='__main__':
  res = (640,480)
  
  cam = Device()
  cam.setResolution(res[0],res[1])
 
  
  brightness = 1.0
  contrast = 1.0
  shots = 0
  
  receiveThread = UdpReceiver()
  receiveThread.setDaemon(True)      # 该选项设置后使得主线程退出后子线程同时退出
  receiveThread.start()
  

  while 1:
    if is_sending: 
      camshot = ImageEnhance.Brightness(cam.getImage()).enhance(brightness)
      camshot = ImageEnhance.Contrast(camshot).enhance(contrast)
      clock = pygame.time.Clock()
      img = cam.getImage().resize((160,120))
      data = img.tostring()
      ser_socket.sendto(data, cli_address) 
      time.sleep(0.05) 
    else:
      time.sleep(1)
  receiveThread.stop()
  ser_socket.close()

客户端:
主要功能是像服务器端发送指令,然后接受服务器所发送过来的数据并通过pygame模块来显示出来.

# -*- coding: UTF-8 -*-

import socket, time
import pygame
from pygame.locals import *
from sys import exit

# 服务器地址,初始化socket
ser_address = ('localhost', 10218)
cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 设置超时
cli_socket.settimeout(5)

# 向服务器发送消息,并判断接收时是否超时,若超时则重发
while 1:
  cli_socket.sendto('startCam', ser_address)
  try:
    message, address = cli_socket.recvfrom(2048)
    if message == 'startRcv':
      print message
      break
  except socket.timeout:
    continue

cli_socket.recvfrom(65536)

# 初始化视频窗口
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption('Web Camera')
pygame.display.flip()

# 设置时间,可以用来控制帧率
clock = pygame.time.Clock()


# 主循环,显示视频信息
while 1:
  try:
    data, address = cli_socket.recvfrom(65536)
  except socket.timeout:
    continue
  camshot = pygame.image.frombuffer(data, (160,120), 'RGB')
  camshot = pygame.transform.scale(camshot, (640, 480))
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      cli_socket.sendto('quitCam', ser_address)
      cli_socket.close()
      pygame.quit()
      exit()
  screen.blit(camshot, (0,0))
  pygame.display.update() 
  clock.tick(20)

客户端就是简单地向服务器发送启动消息,接收到回复后开始进入主循环开始接收视频数据并显示。
由于UDP协议不保证信息是否成功到达,因此前面设置了个重发机制,只有当客户端收到服务器的回复后,才停止发送开启消息并进入主循环.具体见注释.
使用时将localhost改成服务器IP即可.

Python 相关文章推荐
python实现文件快照加密保护的方法
Jun 30 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
python正则中最短匹配实现代码
Jan 16 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python实现归并排序算法
Nov 22 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python脚本导出为exe程序的方法
Mar 25 Python
详解Python IO口多路复用
Jun 17 Python
用python批量解压带密码的压缩包
May 31 Python
深入解析Python中的urllib2模块
Nov 13 #Python
Python下的常用下载安装工具pip的安装方法
Nov 13 #Python
Python的Flask框架的简介和安装方法
Nov 13 #Python
Python编程入门之Hello World的三种实现方式
Nov 13 #Python
python编程开发之textwrap文本样式处理技巧
Nov 13 #Python
python编程开发之日期操作实例分析
Nov 13 #Python
python编程开发之类型转换convert实例分析
Nov 13 #Python
You might like
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python实现html转ubb代码(html2ubb)
2014/07/03 Python
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
python中 * 的用法详解
2019/07/10 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
python基于opencv 实现图像时钟
2021/01/04 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
个人求职信范例
2014/01/29 职场文书
房屋租赁协议书
2014/10/18 职场文书
自主招生自荐信格式
2015/03/04 职场文书
2015年度企业工作总结
2015/05/21 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python