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程序中解析并修改XML内容的方法
Nov 16 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
Python实现时间序列可视化的方法
Aug 06 Python
深入了解python中元类的相关知识
Aug 29 Python
python实现智能语音天气预报
Dec 02 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
Python字典dict常用方法函数实例
Nov 09 Python
Python中threading库实现线程锁与释放锁
May 17 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
php中final关键字用法分析
2016/12/07 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
javascript读取xml
2006/11/04 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
JS实现小米轮播图
2020/09/21 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
在Python中COM口的调用方法
2019/07/03 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python下载的库包存放路径
2020/07/27 Python
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
超市创业计划书
2014/09/15 职场文书
2014年检验科工作总结
2014/11/22 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
健康证明
2015/06/19 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP