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基础之条件与循环控制实例解析
Aug 13 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python中的lstrip()方法使用简介
May 19 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python实现归并排序算法
Nov 22 Python
python实现银联支付和支付宝支付接入
May 07 Python
python导入pandas具体步骤方法
Jun 23 Python
Django Rest framework认证组件详细用法
Jul 25 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
python如何删除列为空的行
Jul 17 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 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环境搭建最新方法
2006/09/05 PHP
php下删除字符串中HTML标签的函数
2008/08/27 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
javascript面向对象之二 命名空间
2011/02/08 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
python中的字典使用分享
2016/07/31 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
使用Python处理BAM的方法
2018/09/28 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
春节请假条
2014/04/11 职场文书
机械专业技术员求职信
2014/06/14 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android