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 相关文章推荐
python3抓取中文网页的方法
Jul 28 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
独特的python循环语句
Nov 20 Python
Python中类的初始化特殊方法
Dec 01 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
Python中反射和描述器总结
Sep 23 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
简单了解python关系(比较)运算符
Jul 08 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
javascript下查找父节点的简单方法
2007/08/13 Javascript
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
document.createElement()用法
2013/03/13 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
Python中的ctime()方法使用教程
2015/05/22 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
Python的时间模块datetime详解
2017/04/17 Python
python使用Tesseract库识别验证
2018/03/21 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Python实现一个优先级队列的方法
2020/07/31 Python
python实现银行账户系统
2021/02/22 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
大学军训感言300字
2014/03/09 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
小学生教师节广播稿
2015/08/19 职场文书
源码安装apache脚本部署过程详解
2022/09/23 Servers