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 28 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python决策树分类算法学习
Dec 22 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
python下载微信公众号相关文章
Feb 26 Python
Pandas的read_csv函数参数分析详解
Jul 02 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Python中内建模块collections如何使用
May 27 Python
用Python开发app后端有优势吗
Jun 29 Python
Anaconda的安装与虚拟环境建立
Nov 18 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
用缓存实现静态页面的测试
2006/12/06 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
js密码强度校验
2015/11/10 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
Python跳出循环语句continue与break的区别
2014/08/25 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
Django框架封装外部函数示例
2019/05/28 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Django Form常用功能及代码示例
2020/10/13 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
中考冲刺决心书
2014/03/11 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
实习报告怎么写
2019/06/20 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android