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海龟绘图实例教程
Jul 24 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
解决DataFrame排序sort的问题
Jun 07 Python
jupyter 导入csv文件方式
Apr 21 Python
在python image 中实现安装中文字体
May 16 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
如何利用pygame实现打飞机小游戏
May 30 Python
python数字转对应中文的方法总结
Aug 02 Python
python中数组和列表的简单实例
Mar 25 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
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
分享15个最受欢迎的Python开源框架
2014/07/13 Python
python获取地震信息 微信实时推送
2019/06/18 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
神路信息Java面试题目
2013/03/31 面试题
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
欢迎家长标语
2014/10/08 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
Linux磁盘管理方法介绍
2022/06/01 Servers