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中的类与对象之描述符详解
Mar 27 Python
使用PDB模式调试Python程序介绍
Apr 05 Python
python发送邮件实例分享
Jul 28 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
用python生成1000个txt文件的方法
Oct 25 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
python有几个版本
Jun 17 Python
Python执行时间的几种计算方法
Jul 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
php+mysql数据库查询实例
2015/01/21 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
JS实现合并json对象的方法
2017/10/10 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
java直接调用python脚本的例子
2014/02/16 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python虚拟环境项目实例
2017/11/20 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python闭包思想与用法浅析
2018/12/27 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
Python面向对象进阶学习
2019/05/21 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
员工工作能力评语
2014/12/31 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
干部考核工作总结2015
2015/07/24 职场文书